![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ожидание события [D5]
_san_ © (2003-08-20 17:12:00)
Добрый вечер!
Я создаю в отдельном потоке функцию, которая выполняется непрерывно в бесконечном цикле, но каждый новый проход цикла должен начинаться по приходу события. Но когда я ставлю функцию ожидания события: WaitForSingleObject(MainHandle, 10000); у меня подвисает все приложение. Можно ли сделать так, что бы приложение не висло на время ожидания события?
panov (2003-08-21 11:10:00) [1]
>_san_ (21.08.03 10:45) [8]
А есть у кого-нибудь ссылки, где можно по подробней почитать о синхронизации нескольких процессов, ну и вообще по этой теме.
Ты бы заглянул на всякий случай сначала в раздел "Статьи" на этом сайте. Вдруг да есть что-нибудь по теме...
_san_ (2003-08-21 10:45:00) [2]
Спасибо всем, теперь хоть что то прояснилось.
А есть у кого-нибудь ссылки, где можно по подробней почитать о синхронизации нескольких процессов, ну и вообще по этой теме.
MBo (2003-08-21 09:52:00) [3]
хотя бы так
procedure TMyThread1.Execute;
begin
while not Terminated do
WaitForSingleObject()
Synchronize(Процедура, сообщающая главному потоку, что дождались);
end;
Verg (2003-08-21 09:51:00) [4]
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;
_san_ (2003-08-21 09:43:00) [5]
А как тогда можно организовать ожидание события, что бы приложение при этом не подвисало?
И как вообще тогда создаются многопоточные приложения, если мне надо синхронизировать несколько процессов, если я усыпляю один процесс, а при этом засыпают все остальные что ли?
_san_ (2003-08-21 09:38:00) [6]
>MBo
>в методе, вызываемом с помощью Synchronize, должно быть
>минимум действий - только общение с VCL главного потока
Так что в потоке вообще ни какого кода писать нельзя?
А если мне надо параллельно запустить два каких-нибудь расчета.
MBo (2003-08-20 18:18:00) [7]
Из серии - никогда и ни за что так не делайте ;)
procedure TMyThread1.Execute;
begin
while not Terminated do
Synchronize(DoWork);
end;
в методе, вызываемом с помощью Synchronize, должно быть минимум действий - только общение с VCL главного потока
_san_ (2003-08-20 18:09:00) [8]
Код примерно такой:
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;
Игорь Шевченко (2003-08-20 17:21:00) [9]
Код в студию