Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поток в потоке [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]

Хочу спросить. А зачем эта вся чудная схема придумана?


Наверх

Титульная страница Поиск, карта сайта Написать письмо