Очікування події

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

Код приблизно такий:

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

procedure TMyThread1.Execute; begin якщо не Terminated do Synchronize(DoWork); end;

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

procedure ResivData; begin // прийом даних … SetEvent(MainHandle); end;

З серії - ніколи і нізащо так не робіть;)

procedure TMyThread1.Execute; begin якщо не Terminated do Synchronize(DoWork); end;

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

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

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

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

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

> procedure TMyThread1.Execute; > begin > while не Terminated do case WaitForSingleObject(MainHandle, 10000) of WAIT_OBJECT_0: Synchronize(DoWork); end; > end; > > procedure TMyThread1.DoWork; > begin > // ResetEvent(MainHandle);подію краще зробити з автоскиданням> //обробка даних > … > > end;

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

Дякую всім, тепер хоч щось прояснилося. А є у кого-небудь посилання, де можна детальніше почитати про синхронізацію декількох процесів, ну і взагалі з цієї теми.

>_san_ (21.08.03 10:45) [8]А є у кого-небудь посилання, де можна по детальніше почитати про синхронізацію декількох процесів, ну і взагалі з цієї теми.

Ти б заглянув про всяк випадок спочатку в розділ "Статті" на цьому сайті. Раптом так є щось на тему.