Очікування події
Добрий вечір! Я створюю в окремому потоці функцію, яка виконується безперервно в нескінченному циклі, але кожен новий прохід циклу повинен починатися після приходу події. Але коли я ставлю функцію очікування події: 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]А є у кого-небудь посилання, де можна по детальніше почитати про синхронізацію декількох процесів, ну і взагалі з цієї теми.
Ти б заглянув про всяк випадок спочатку в розділ "Статті" на цьому сайті. Раптом так є щось на тему.