Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Чем заменить 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.041 c
3-1081825030
rosl
2004-04-13 06:57
2004.04.11
ehlib


1-1082476978
jiuraf
2004-04-20 20:02
2004.04.11
Как скопироватьсодержимое RichEdit1 В RichEdit2?


14-1074854685
Knight
2004-01-23 13:44
2004.04.11
Готика 2... где там брать ключи?


1-1082350586
Denizzz
2004-04-19 08:56
2004.04.11
StringGrid - выравнивание чисел по правому краю


4-1079082244
saska
2004-03-12 12:04
2004.04.11
LoadMenu





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский