Конференция "Начинающим" » Вопрос по потокам
 
  • _ПЛОВ © (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;    

  • sniknik © (27.02.18 10:48) [1]
    через 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 сервисов) и пользоваться старыми вариантами синхронизации через АПИ.
    (Я рассматриваю высоконагруженные сервисы)
 
Конференция "Начинающим" » Вопрос по потокам
Есть новые Нет новых   [134427   +34][b:0][p:0.001]