Использование нескольких потоков

В программе может быть столько потоков, сколько необходимо. В следующем примере создается сразу два потока выполнения. Первый поток выполняет действия, аналогичные потоку предыдущего примера, второй поток каждые 2 секунды 50 раз выдает звуковой сигнал:

UINT MyThread1(LPVOID pParam); UINT MyThread2(LPVOID pParam); void CExampleView::OnStart() { AfxBeginThread(MyThread1,this); AfxBeginThread(MyThread2,NULL); // параметр не передается } UINT MyThread1(LPVOID pParam) { CExampleView *ptrView=(CExampleView *)pParam; for(int i=0; i<100; i++) { CDC *dc=ptrView->GetDC(); CRect r; ptrView->GetClientRect(&r); dc->TextOut(rand()%r.Width(),rand()%r.Height(),"*",1); } return 0; } UINT MyThread2(LPVOID pParam) { for(int i=0; i<50; i++) { Sleep(2000); MessageBeep(0); } return 0; }

При работе с несколькими потоками для каждого из них должна быть определена своя потоковая функция и каждый из них должен начинаться отдельно. Все потоки процесса затем функционируют одновременно.

Остановка и возобновление выполнения потоков

Остановить выполнение потока можно с помощью метода SuspendThread классаCWinThread. В остановленном состоянии поток не выполняется. Продолжить выполнение потока можно с помощью метода ResumeThread класса CWinThread.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: