Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Чем заменить TThread.Suspend ?   Найти похожие ветки 

 
Timego   (2004-03-24 13:16) [0]

Уважаемые мастера!
В форуме неоднократно высказывалась мысль о том, что
TThread.Suspend и TThread.Resume - проктологический способ остановки-старта потока и что лучше пользоваться отправкой сообщения потоку.

А как быть если нужно приостановить какой-то поток, но не выходить из Tthread.Execute (чтобы потом не создавать заново) и так чтобы поток не крутился все время вхолостую проверяя какое-то условие? Suspend как раз в этом случае выручал, хотя иногда возникают сложности. Подскажите, пожалуйста, как сделать лучше.


 
Digitman ©   (2004-03-24 13:26) [1]

TMyThread = class(TThread)
 procedure MsgПроснись(var message: TMessage); message TM_ПРОСНИСЬ;
end;
..

procedure TMyThread.Execute;
begin
 while not Terminated and GetMessage(Msg, 0, 0, 0) do //спим, когда надо - нас разбудит система
  Dispatch(Msg.Message); //проснулись и пытаемся понять, чего от нас хотят
end;

procedure TMyThread.MsgПроснись(var message: TMessage);
begin
//ба !! на самом деле нас разбудили не зря - чего-то хотят из-под нас ..
 MessageBox(0, "Угу .. глазки продрали ... что надо ?", "", mb_ok);
end;

..

//где-то в ином потоке пробуждаем MyThread-поток - заспался он ... пора делом заняться ...

PostThreadMessage(MyThread.ThreadId, TM_ПРОСНИСЬ, 0, 0);


 
Игорь Шевченко ©   (2004-03-24 13:30) [2]


> В форуме неоднократно высказывалась мысль о том, что
> TThread.Suspend и TThread.Resume - проктологический способ
> остановки-старта потока и что лучше пользоваться отправкой
> сообщения потоку.


Ламеров кругом хватает, если всех слушать...


 
Игорь Шевченко ©   (2004-03-24 13:35) [3]

А для синхронизации потоков используются объекты синхронизации, как ни странно, Critical Sections, Events, Semaphores, и т.п., в зависимости от задачи. Может, имелась в виду именно синхронизация ?


 
Юрий Зотов ©   (2004-03-24 13:44) [4]

Спокойно можете использовать Suspend/Resume.


 
Vuk ©   (2004-03-24 13:51) [5]

Правда, нужно учитывать, что после Suspend для корректного завершения потока нужно будет делать Resume. Иногда вместо suspend/resume можно использовать то, что предложил Digitman или, как вариант, ожидание события при помощи WaitForXXXX


 
Digitman ©   (2004-03-24 14:03) [6]


> Timego


еще универсальней способ с "усыплением" потока вызовом MsgWaitForMultipleObjects

при этом "спящий" поток приобретает способность немедленно реагировать как на сообщения, адресованные ему и его окнам, так и на сигналы 6-ти с лишним десятков объектов синхронизации

PostThreadMessage(MyThread, TM_ДЕЛАЙ_ТО, ...);
PostThreadMessage(MyThread, TM_ДЕЛАЙ_СЕ, ...);
SendMessage(SomeThreadWindow, ...)
SetEvent(SomeSyncEvent);
ReleaseSemaphore(SomeSemaphore, ..);
ReleaseMutex(SomeMutex);
CloseHandle(SomeSyncObj);

и т.д. и т.п.
PostThreadMessage(MyThread, TM_ЗАКРУГЛЯЙСЯ_ПОРА_УМИРАТЬ, ...);

на все это "спящий" за неимением дела поток будет реагировать именно в нужное время



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.036 c
3-1079020318
Дмитрий 2004
2004-03-11 18:51
2004.04.11
Распечатка нескольких значений строк в DBGrid


3-1081851425
united
2004-04-13 14:17
2004.04.11
Oracle. вставка CLOB c помощью DOA


3-1079327688
Лысый
2004-03-15 08:14
2004.04.11
Update


3-1081511017
Clasic
2004-04-09 15:43
2004.04.11
Сыпится Paradox, глюки с индексами


9-1065171136
Zergling
2003-10-03 12:52
2004.04.11
DerectDraw - SetPalette