-
_ПЛОВ © (27.02.18 10:02) [0]Добрый день! Вопрос такой...
Нужно в потоке сделать свое событие, правильно ли я понимаю, что это должно быть сделано как-то так:
TMyThread = class(TThread)
private
...
FOnMyEvent: TNotifyEvent;
protected
procedure Execute; override;
public
constructor Create(OnMyEvent: TNotifyEvent);
destructor Destroy; override;
procedure MyEvent;
end;
constructor TMyThread.Create(OnMyEvent: TNotifyEvent);
begin
inherited Create(True);
FreeOnTerminate := False;
Self.Priority := tpNormal;
FOnMyEvent := OnMyEvent;
Resume;
end;
procedure TMyThread.MyEvent;
begin
if Assigned(FOnMyEvent) then
FOnMyEvent(Self);
end;
procedure TMyThread.Execute;
begin
while not Terminated do
begin
// распознавание
if ... then
Synchronize(MyEvent);
// остановка
Self.Terminate;
end;
end; -
через Synchronize это будет событие не в потоке... вернее не в этом, а в основном, там где и все остальные, и будет также тормозить основной поток.
+ зачем остановка после выполнения единственного "события"? да еще таким варварским методом... простого выхода из цикла посредством break было бы достаточно чтобы поток нормально завершился.
вообще, все что ты тут привел можно заменить одним PostMessage. ну и цикл событий... нормальных, организовывается с помощью "событийных" функций типа GetMessage, например
procedure TLogThread.Execute;
begin
while GetMessage(Msg, 0, 0, 0) do begin //Terminated не нужен, т.к. пример на замену выходом своего события
try
DispatchMessage(Msg);
if Msg.message = WM_LOG then begin //собственно "свое событие"
if Msg.lParam = STOPLOG then Exit; //действие
end;
except {NOTHING} end;
end;
end;
//вызов "события"
PostThreadMessage(LogThreadID {ThreadID}, WM_LOG, 0, STOPLOG); -
_ПЛОВ © (27.02.18 10:57) [2]Понятно, спасибо
-
Rouse_ © (28.02.18 18:29) [3]Небольшой оффтоп, но по теме.
Я ты не стал уповать на Synchronize, особенно в последних версиях Дельфи, увы - много чего поломали и можно выйти на банальный дедлок (внутри VCL) при стандартной казалось бы ситуации.
К сожалению, но по работе мне все чаще и чаще приходиться отказываться от данного механизма (с внедрением VCL сервисов) и пользоваться старыми вариантами синхронизации через АПИ.
(Я рассматриваю высоконагруженные сервисы)