Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ожидание события [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]

Код в студию


Наверх

Титульная страница Поиск, карта сайта Написать письмо