Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Вопрос по потокам


_ПЛОВ ©   (27.02.18 10:02

Добрый день! Вопрос такой...
Нужно в потоке сделать свое событие, правильно ли я понимаю, что это должно быть сделано как-то так:


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 сервисов) и пользоваться старыми вариантами синхронизации через АПИ.
(Я рассматриваю высоконагруженные сервисы)


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо