Форум: "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.018 c