Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.27;
Скачать: CL | DM;

Вниз

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

 
_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 вся ветка

Текущий архив: 2003.10.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
14-89537
stone
2003-10-08 15:14
2003.10.27
Клавиша Shift снимет защиту от копирования CD :)


3-89136
Inkotex
2003-10-07 18:25
2003.10.27
Blob поля


9-89091
diaz
2002-11-25 22:55
2003.10.27
OpenGL : QUTERNIONS


1-89315
p0tia
2003-10-16 18:21
2003.10.27
Как правильно написать данный код?


8-89395
Andrey02
2003-06-21 13:57
2003.10.27
иконка ICO в приложении