Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4]      все
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24062
Thread
CoInitialize

"Не читал...", замени на CoInitializeEx(nil, COINIT_MULTITHREADED)
14 май 18, 15:23    [21408505]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
Thread
Guest
CoInitializeEx(nil, COINIT_MULTITHREADED) 

спасибо, не знал.


Я долго не мог взять в толк насчет TEvent'a, пока не догадался, что их нужно два. Я ведь прав?

(скопирую картинку с предыдущей страницы, а то она бесполезно никем не будет увидена)
Картинка с другого сайта.
14 май 18, 15:37    [21408552]     Ответить | Цитировать Сообщить модератору
 Re: Как организовать ожидание пока Thread не отработает задание  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24062
Ну и вариант от меня: \.m./ :)
Два потока. Первый запускает второй и получает от него ответ в своем контексте.

+
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, wcthread;

type

    { TForm1 }

    TForm1 = class(TForm)
        Memo1: TMemo;
        Task1: TTask;
        Task2: TTask;
        WCThread1: TWCThread;
        WCThread2: TWCThread;
        procedure FormCreate(Sender: TObject);
        procedure Task1Execute(const Sender: TTask; const Msg: Word; var Param: Variant);
        procedure Task1Finish(const Sender: TTask; const Msg: Word; const Param: Variant);
        procedure Task2Finish(const Sender: TTask; const Msg: Word; const Param: Variant);
        procedure TaskMessage(const Sender: TTask; const Msg: Word; const Param: Variant);
        procedure Task2Execute(const Sender: TTask; const Msg: Word; var Param: Variant);
    private
        procedure AddToLog(const AText: string);
    public

    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
    Memo1.Clear;
    AddToLog(Format('MainThread: %d', [GetCurrentThreadId]));
    Task1.Start; // запуск первого потока
end;

procedure TForm1.AddToLog(const AText: string);
begin
    Memo1.Lines.Add(AText);
end;

procedure TForm1.Task1Execute(const Sender: TTask; const Msg: Word; var Param: Variant);
begin
    // первый поток
    Sender.PostMessage(1, Format('Task1Execute thread: %d', [GetCurrentThreadId]));
    Sender.WaitMs(100);
    Task2.Start(Sender.Parent); // запуск второго потока с указанием потока-владельца (первый поток)
end;

procedure TForm1.Task1Finish(const Sender: TTask; const Msg: Word; const Param: Variant);
begin
    // выполняется в главном потоке
    Sender.PostMessage(1, Format('Task1Finish thread: %d', [GetCurrentThreadId]));
end;

procedure TForm1.Task2Execute(const Sender: TTask; const Msg: Word; var Param: Variant);
begin
    // второй поток
    Sender.PostMessage(1, Format('Task2Execute thread: %d', [GetCurrentThreadId]));
    Sender.WaitMs(1000);
end;

procedure TForm1.Task2Finish(const Sender: TTask; const Msg: Word; const Param: Variant);
begin
    // выполняется в контексте первого потока
    Sender.PostMessage(1, Format('Task2Finish thread: %d', [GetCurrentThreadId]));
end;

procedure TForm1.TaskMessage(const Sender: TTask; const Msg: Word; const Param: Variant);
begin
    // выполняется в завимимости от... то в главном потоке, то в первом (здесь некрасивый код, нельзя в УИ лезть из других потоков)
    case Msg of
        1: AddToLog(Param);
    end;
end;

end.

Task1 из WCThread1, соответственно Task2 из WCThread2.
Лог:

MainThread: 13736 основной поток
Task1Execute thread: 10176 первый поток
Task1Finish thread: 13736 основной поток
Task2Execute thread: 1188 второй поток
Task2Finish thread: 10176 первый поток
14 май 18, 16:02    [21408636]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4]      все
Все форумы / Delphi Ответить