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

Вниз

ожидание события   Найти похожие ветки 

 
_san_   (2003-08-20 17:12) [0]

Добрый вечер!
Я создаю в отдельном потоке функцию, которая выполняется непрерывно в бесконечном цикле, но каждый новый проход цикла должен начинаться по приходу события. Но когда я ставлю функцию ожидания события: WaitForSingleObject(MainHandle, 10000); у меня подвисает все приложение. Можно ли сделать так, что бы приложение не висло на время ожидания события?


 
Игорь Шевченко   (2003-08-20 17:21) [1]

Код в студию


 
_san_   (2003-08-20 18:09) [2]

Код примерно такой:

TMyThread1 = class(TThread)
private
{ Private declarations }
protected
procedure DoWork;
procedure Execute; override;
end;

procedure TMyThread1.Execute;
begin
while not Terminated do
Synchronize(DoWork);
end;

procedure TMyThread1.DoWork;
begin
hRel:= WaitForSingleObject(MainHandle, 10000);
ResetEvent(MainHandle);
//обработка данных


end;



procedure ResivData;
begin
//прием данных

SetEvent(MainHandle);
end;


 
MBo   (2003-08-20 18:18) [3]

Из серии - никогда и ни за что так не делайте ;)

procedure TMyThread1.Execute;
begin
while not Terminated do
Synchronize(DoWork);
end;

в методе, вызываемом с помощью Synchronize, должно быть минимум действий - только общение с VCL главного потока


 
_san_   (2003-08-21 09:38) [4]

>MBo
>в методе, вызываемом с помощью Synchronize, должно быть
>минимум действий - только общение с VCL главного потока

Так что в потоке вообще ни какого кода писать нельзя?
А если мне надо параллельно запустить два каких-нибудь расчета.


 
_san_   (2003-08-21 09:43) [5]

А как тогда можно организовать ожидание события, что бы приложение при этом не подвисало?
И как вообще тогда создаются многопоточные приложения, если мне надо синхронизировать несколько процессов, если я усыпляю один процесс, а при этом засыпают все остальные что ли?


 
Verg   (2003-08-21 09:51) [6]

Synchronyze приводит к тому, что метод, указанный в ее параметрах, выполняется главным потоком. Т.о. WaitFor... денает длавный поток, и следственно, прога "подвисает".
WaitFor... в данном случае, должен выполняться непосредственно в контексте TMyThread1:


> procedure TMyThread1.Execute;
> begin
> while not Terminated do
case WaitForSingleObject(MainHandle, 10000) of
WAIT_OBJECT_0: Synchronize(DoWork);
end;
> end;
>
> procedure TMyThread1.DoWork;
> begin
> // ResetEvent(MainHandle); событие лучше сделать с автосбросом> //обработка данных
> …
>
> end;


 
MBo   (2003-08-21 09:52) [7]

хотя бы так
procedure TMyThread1.Execute;
begin
while not Terminated do
WaitForSingleObject()
Synchronize(Процедура, сообщающая главному потоку, что дождались);
end;


 
_san_   (2003-08-21 10:45) [8]

Спасибо всем, теперь хоть что то прояснилось.
А есть у кого-нибудь ссылки, где можно по подробней почитать о синхронизации нескольких процессов, ну и вообще по этой теме.


 
panov   (2003-08-21 11:10) [9]

>_san_ (21.08.03 10:45) [8]
А есть у кого-нибудь ссылки, где можно по подробней почитать о синхронизации нескольких процессов, ну и вообще по этой теме.

Ты бы заглянул на всякий случай сначала в раздел "Статьи" на этом сайте. Вдруг да есть что-нибудь по теме...



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

Форум: "WinAPI";
Текущий архив: 2003.10.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.01 c
1-89237
Романов Р.В.
2003-10-14 22:03
2003.10.27
Сохранение/загрузка компонента


6-89430
Support1
2003-08-28 22:26
2003.10.27
Как скачать заголовки новостей с сайта и еще ...


1-89359
Alecs
2003-10-15 18:10
2003.10.27
Как узнать, запущена-ли сейчас Delphi IDE?


14-89558
sniknik
2003-10-08 15:58
2003.10.27
Принимаю поздравления, кому проставлятся? ;)


3-89163
Explorer
2003-09-15 13:30
2003.10.27
InstallShield и BDE





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский