Форум программистов, компьютерный форум, киберфорум
Delphi: FireMonkey
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 16.10.2013
Сообщений: 46
1

Синхронизация потоков (Delphi XE6)

24.04.2014, 11:09. Показов 2732. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вылетает с ошибкой, проблема из синхронизацией.
Возможно я ошибаюсь, но дабы не копировать весь код программы, привел пример кода, который работал на ХЕ5.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
unit Main;
 
interface
 
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  FMX.Layouts, FMX.Memo;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
  end;
 
  TMYThread = class (TTHread)
  private
    FStr: string;
  public
    procedure Execute; override;
    procedure UpdateMemo;
  end;
 
var
  Form1: TForm1;
  NewThread: TMYThread;
 
implementation
 
{$R *.fmx}
 
{ TMYThread }
 
procedure TMYThread.Execute;
var I: Integer;
begin
//  inherited;
  I:= 0;
  while I < High(Integer) do begin
    Inc(I);
    FStr := IntToStr(I);
//    Sleep(10);  // с ним работает
    Synchronize(NewThread,UpdateMemo);
  end;
end;
 
procedure TMYThread.UpdateMemo;
begin
  Form1.Memo1.Lines.Add(NewThread.FStr) ;
  Form1.Memo1.GoToTextEnd;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  NewThread := TMYThread.Create(true);
  NewThread.FreeOnTerminate := true;
  NewThread.Priority := tpLower;
  NewThread.Start;
end;
 
 
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2014, 11:09
Ответы с готовыми решениями:

Delphi XE6 fmx куда делся Tpolygon
В прежних версиях (как знаю в XE3) в модуле System.Types был тип Tpolygon, в ХЕ6 переменную этого...

Что использовать - Delphi XE6 или Delphi 7?
Delphi EX6 или Delphi 7? Какая разница(интерфейс не трогать)? Где больше +/-?Что использовать?...

Delphi XE6 - отзывы пользователей
И снова вышла новая версия Delphi - XE6. Среди новшеств,заявленных разработчиками - исправления...

Не могу установить Delphi XE6
Народ, помогите, не могу установить Embarcadero Delphi XE6 Запускаю установку,...

8
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
25.04.2014, 07:32 2
Delphi
1
Synchronize(NewThread,UpdateMemo);
????
в методе класса - ссылка на конкретный экзаемпляр?

Delphi
1
Synchronize(UpdateMemo);
0
0 / 0 / 0
Регистрация: 16.10.2013
Сообщений: 46
25.04.2014, 11:46  [ТС] 3
Если речь идет про
Delphi
1
Synchronize(UpdateMemo);
, то такой вариант тоже вылетает с ошибкой.
Перепробовал
Delphi
1
Synchronize(nil,UpdateMemo);
и
Delphi
1
2
3
4
5
   Synchronize(procedure
     begin
       Form1.Memo1.Lines.Add(NewThread.FStr) ;
       Form1.Memo1.GoToTextEnd;
    end);
в результате - ошибка
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
25.04.2014, 14:01 4
а так ?
Delphi
1
2
Form1.Memo1.Lines.Add(FStr) ;
Form1.Memo1.GoToTextEnd;
0
0 / 0 / 0
Регистрация: 16.10.2013
Сообщений: 46
25.04.2014, 14:58  [ТС] 5
Особой разницы не увидел - вроде как работает, но если потаскать форму, изменить ее размер и т.д. - ошибка.
Складывается впечатление, что абракадабра через каждые 5 мин. штампует очередные версии делфи, меняя при этом внешний вид, как того требует менеджмент с новыми глюками в придачу, не устраняя старые.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
26.04.2014, 00:42 6
Если бы не работал TThread, вообще бы ничего не работало. Это основа основ.
Я активно использую потоки. Жив пока. Вопрос по XE6 конечно может стоять. Но я сильно сомневаюсь...

А я правильно понимаю, что идет запись в Memo 2147483647 строк???
А оно должно влезать вообще?
0
0 / 0 / 0
Регистрация: 16.10.2013
Сообщений: 46
26.04.2014, 01:11  [ТС] 7
А я правильно понимаю, что идет запись в Memo 2147483647 строк???
А оно должно влезать вообще?
С влезать вообще, я согласен. Но у меня до 1000 может ошибка вылезти, если например скроллом поиграться в мемо.
Мне кажется именно Memo1.GotoTextEnd одна из причин
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
26.04.2014, 08:12 8
вот это точно работает на XE5

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
unit Main;
 
interface
 
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
  FMX.Layouts, FMX.Memo;
 
type
  TMYThread = class (TTHread)
  private
    FStr: string;
  public
    procedure Execute; override;
    procedure UpdateMemo;
  end;
 
  TForm1 = class(TForm)
    b1: TButton;
    memo1: TMemo;
    procedure b1Click(Sender: TObject);
    procedure ThreadTerminate(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  private
    NewThread:TMYThread;
    FExit:Boolean;
  public
  end;
 
 
var
  Form1: TForm1;
 
implementation
 
{$R *.fmx}
 
{ TMYThread }
 
procedure TMYThread.Execute;
var I: Integer;
begin
//  inherited;
  I:= 0;
  while (not Terminated) and (I < 5000) do begin
    Inc(I);
    FStr := IntToStr(I);
    Synchronize(UpdateMemo);
  end;
end;
 
procedure TMYThread.UpdateMemo;
begin
  Form1.Memo1.Lines.Add(FStr) ;
  Form1.Memo1.GoToTextEnd;
end;
 
 
procedure TForm1.b1Click(Sender: TObject);
begin
  if NewThread<>NIL then
    Exit;
  NewThread := TMYThread.Create(true);
  NewThread.FreeOnTerminate := true;
  NewThread.Priority := tpLower;
  NewThread.OnTerminate := ThreadTerminate;
  NewThread.Start;
end;
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if NewThread<>NIL then
  begin
    CanClose := false;
    FExit := true;
    NewThread.Terminate;
  end;
end;
 
procedure TForm1.ThreadTerminate(Sender: TObject);
begin
  NewThread := NIL;
  if FExit then
    Close;
end;
 
end.
0
0 / 0 / 0
Регистрация: 16.10.2013
Сообщений: 46
26.04.2014, 11:38  [ТС] 9
Вот и я про что говорю, а на XE6 не хочет.
В целях обучения буду копать дальше: мьютексы, критические секции, винапи. Хотя насчет первых двух не уверен, потому как TThread уже показал себя.
krapotkin, спасибо. А то я в силу своей неопытности сомневался в себе: обычно глючит между креслом и клавиатурой, а здесь вон оно как получается...
0
26.04.2014, 11:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2014, 11:38
Помогаю со студенческими работами здесь

Синхронизация потоков
Снова привет. на этот раз возникла проблема с синхронизацией потоков. Суть программы - создать N...

Синхронизация потоков с использованием семафоров
Помогите пожалуйста с материалам по потокам... ничего дельного найти не могу. необходимо бокировать...

Синхронизация потоков на элементарном уровне (переключение потоков)
в общем разбираюсь с потоками, на сколько понял мне нужен lock Вот имеется просто пример ...

C++ Builder: FireMonkey XE6 - поделитесь рецептом использования потоков
Доброго времени суток. Проблема собственно на видео: 5NufmuWXem4 Код открытия потока: bool...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru