powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как организовать ожидание пока Thread не отработает задание
3 сообщений из 78, страница 4 из 4
Как организовать ожидание пока Thread не отработает задание
    #39644488
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thread
Код: pascal
1.
CoInitialize


"Не читал...", замени на CoInitializeEx(nil, COINIT_MULTITHREADED)
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39644498
Thread
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: pascal
1.
CoInitializeEx(nil, COINIT_MULTITHREADED) 


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


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

(скопирую картинку с предыдущей страницы, а то она бесполезно никем не будет увидена)
...
Рейтинг: 0 / 0
Как организовать ожидание пока Thread не отработает задание
    #39644510
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и вариант от меня: \.m./ :)
Два потока. Первый запускает второй и получает от него ответ в своем контексте.

Код: pascal
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 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 первый поток
...
Рейтинг: 0 / 0
3 сообщений из 78, страница 4 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как организовать ожидание пока Thread не отработает задание
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]