Визуальное программирование и MFC



         

Работа с объектами событий - часть 2


При работе с программным объектом события необходимо вызывать метод ResetEvent класса CEvent всякий раз, когда поступил сигнал о выполнении события. После его вызова соответствующий объект будет сброшен.

Чтобы продемонстрировать вышесказанное, заменим в предыдущем примере семафор на объект событие. В этой версии функция MyThread1 будет блокирована до тех пор, пока функция MyThread2 не завершится и не сигнализирует о своем завершении. Таким образом, завершение функции MyThread2 является событием, которое ожидает MyThread1:

class CExampleView : public CView { protected: // 1. событие не установлено; 2. сброс его будет автоматическим CEvent event; // другие описания класса ...….. }; .......... UINT MyThread1(LPVOID pParam); UINT MyThread2(LPVOID pParam); void CExampleView::OnStart() { AfxBeginThread(MyThread1,this); AfxBeginThread(MyThread2,this; } UINT MyThread1(LPVOID pParam) { CExampleView *ptrView=(CExampleView *)pParam; CSingleLock syncObj(&(ptrView->event)); ....... syncObj.Lock(); // ожидание события действия, выполняемые после события syncObj.Unlock(); // освобождение объекта события ....... return 0; } UINT MyThread2(LPVOID pParam) { CExampleView *ptrView=(CExampleView *)pParam; ....... ptrView->event.SetEvent(); // сигнализирует о событии return 0; }

Как уже говорилось, объектами синхронизации являются не только семафоры и объекты события, а и критические разделы и исключающие семафоры. Их использование во многом похоже на рассматриваемые выше действия с семафорами и объектами событие. Стоит только отметить, что в некоторых ситуациях использование критических разделов позволяет более эффективно организовать работу с потоками.




Содержание  Назад  Вперед