![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поток в потоке [D7, WinXP]
Tivaya © (2006-08-02 21:11:00)Люди!
У меня есть поток. На определенном этапе выполнения он должен приостановиться, в этот момент создается второй поток, в который передаются данные из первого, каким-то образом обрабатываются и обработанные возвращаются в основной поток. Второй поток уничтожается. А первый после этого возобновляет работу. Вот.
Никак не могу понять какие методы тут уместно использовать,
Tivaya (2006-08-02 22:26:00) [1]Пусик, спасибо большое! :)
Пусик (2006-08-02 22:15:00) [2]
> Tivaya ©
Один вариант из многих:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TThr1=class(TThread)
FStr: String;
procedure Execute; override;
procedure EndChild(Sender: TObject);
procedure ShowStr;
end;
TThrChild1=class(TThread)
FParm: String;
constructor Create(const Parm: String);
procedure Execute; override;
end;
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TThr1 }
procedure TThr1.EndChild(Sender: TObject);
begin
FStr := TThrChild1(Sender).FParm;
Synchronize(ShowStr);
Resume;
end;
procedure TThr1.Execute;
begin
FreeOnTerminate := True;
with TThrChild1.Create('String parm1') do
begin
OnTerminate := EndChild;
Resume;
end;
Suspend;
with TThrChild1.Create('String parm2') do
begin
OnTerminate := EndChild;
Resume;
end;
Suspend;
with TThrChild1.Create('String parm3') do
begin
OnTerminate := EndChild;
Resume;
end;
Suspend;
end;
procedure TThr1.ShowStr;
begin
Form1.Memo1.Lines.Add(FStr);
end;
{ TThrChild1 }
constructor TThrChild1.Create(const Parm: String);
begin
inherited Create(True);
FreeOnTerminate := True;
FParm :=Parm;
end;
procedure TThrChild1.Execute;
begin
try
FParm := FParm+'... Passed';
Sleep(1000);
except
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
TThr1.Create(False);
end;
end.
Tivaya (2006-08-02 21:47:00) [3]
> Ну например в OnTerminate можно эти данные получить..
>
Как конкретно?!
Джо (2006-08-02 21:47:00) [4]Ну, если для тренировки, то нужно тренироваться, не буду мешать :)
Tivaya (2006-08-02 21:46:00) [5]
> Хочу спросить. А зачем эта вся чудная схема придумана?
>
Это для тренировки использования методов потока. Сама знаю, что абсурд, но вот надо сделать и все.
jack128 (2006-08-02 21:22:00) [6]нафиг второй поток, если первый всё равно ждет пока тот не завершится? Все действия пусть выполняет первый поток.
Tivaya © (02.08.06 21:11)
Никак не могу понять какие методы тут уместно использовать,
для чего? Для передачи результата в основной поток? Ну например в OnTerminate можно эти данные получить..
Джо (2006-08-02 21:12:00) [7]Хочу спросить. А зачем эта вся чудная схема придумана?