|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Наследник TThread в отдельном модуле
Собственно была программа на D7, ввиду запутанности кода и в связи с переходом на XE4 решил переписать с нуля.
В частности, из главного окна, в цикле запускаются потоки, в потоке IdHTTP проверяет наличие файла и возвращает строку в зависимости от ответа. Когда наследник TThread описан в модуле главного окна все просто Код:
... Synchronize(WriteRespons); end; procedure TDownload.WriteRespons; begin Form1.Memo1.Lines.Append(ResStr); Form1.ProgressBar2.Position:= trcount; {и т.д.} Вроде бы вариант - посылка сообщения, но в сообщении нельзя передать строку, можно передать указатель, а с указателями для меня не все ясно. Где-то наткнулся на идею обработать OnTerminate Код:
unit MyThreads; ... type TMyThread = class(TThread) ... public property Str: string read FStr write FStr; end; unit Unit1; ... var Form1: TForm1; thr: TMyThread; ... procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin ListBox1.Clear; for i := 0 to 12 do begin thr:= TMyThread.Create(True); thr.FreeOnTerminate:= True; thr.OnTerminate:= Form1.MyProc; thr.Start; end; end; procedure TForm1.MyProc(Sender: TObject); begin ListBox1.Items.Append('Str - '+thr.Str); end; Вообще в Дельфи стандартно и создается отдельный модуль (New>Other>Thread Object) и в заготовке модуля в комментарии говорится о необходимости использования Synchronize, значит есть какой то способ обмена данными. А во всех статьях "Потоки для чайников" пишут - " ... для простоты опишем новый класс в главном модуле ...", хоть кто-нибудь привел бы пример с отдельным unit-ом. Похоже я как всегда упускаю что-то до такой степени очевидное, что об этом ни кто не пишет. |