ALTE DOCUMENTE
|
||||||||||
Приведе 131p1515b ;нная ниже программа демонстрирует использование семафора. Это предыдущий пример, видоизмененный таким образом, что два потока выполняются не параллельно, а по очереди. Заметьте, что дескриптор семафора является внешней переменной, а сам семафор создается при создании главного окна программы. Это позволяет использовать его во всех потоках программы (включая главный поток).
#include <Windows.h>
#include <String.h>
#include <Stdio.h>
#include "Proc.h"
#define Procmax 5
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
DWORD MyThread1(LPVOID); //
DWORD MyThread2(LPVOID); //
char szWinName[] = " "; //
char str[255]; // Буфер строки вывода
int X=0, Y=0; // Текущие координаты строки
int procnum=0; // Количество активных процессов
DWORD Tid1; // Идентификатор 1-го потока
DWORD Tid2; // Идентификатор 3-го потока
int maxX, maxY; // Размеры экрана
HDC memdc; // DC виртуального окна
HBITMAP hbit; // Растр - это виртуальное окно
HBRUSH hbrush; //
PROCESS_INFORMATION pinfo[Procmax];
HANDLE hSema; //
TEXTMETRIC tm;
int WINAPI WinMain (HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
return msg. wParam;
}
// Windows и получает в качестве параметров сообщения
LRESULT CALLBACK WindowFunc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
// Не более чем Procmax
// Получить метрики текста */
GetTextMetrics(memdc, &tm);
sprintf(str, "Порождается процесс %d",
procnum);
TextOut(memdc, X, Y, str, strlen(str));
Y = Y+tm.tmHeight+tm.tmExternalLeading;
InvalidateRect hwnd NULL
// Порождение нового процесса
startin.cb=sizeof(STARTUPINFO);
startin.lpReserved = NULL;
startin.lpDesktop = NULL;
startin.lpTitle = NULL;
startin.dwFlags =STARTF_USESHOWWINDOW;
startin.cbReserved2 = 0;
startin.lpReserved2 = NULL;
startin.wShowWindow = SW_SHOWMINIMIZED;
CreateProcess(NULL, "Test.exe", NULL,
NULL, FALSE, 0, NULL,
NULL, &startin,
&(pinfo[procnum]));
procnum++;
break;
case ID_KILLPROC:
if(procnum)
procnum--;
else
// Получить метрики текста
GetTextMetrics(memdc, &tm);
TerminateProcess
(pinfo[procnum].hProcess, 0);
sprintf(str, " %d ",
procnum);
TextOut(memdc, X, Y, str, strlen(str));
Y = Y+tm.tmHeight+tm.tmExternalLeading;
InvalidateRect(hwnd,NULL,1); //
break;
case ID_THREAD:
CreateThread
(NULL, 0,
(LPTHREAD_START_ROUTINE)MyThread1,
(LPVOID)NULL, 0, &Tid1);
CreateThread
(NULL, 0,
(LPTHREAD_START_ROUTINE)MyThread2,
(LPVOID)NULL, 0, &Tid2);
InvalidateRect(hwnd, NULL, 1);
break;
case ID_HELP:
MessageBox(hwnd,
"F2: Новый процесс\n"
"F3: Завершить процесс\n"
"F4: Новый поток",
"Помощь:", MB_OK);
InvalidateRect(hwnd,NULL,1); //
break;
}
break;
case WM_PAINT: //
hdc=BeginPaint(hwnd,&paintstruct); // DC
// Теперь копируем растр из памяти на экран
BitBlt(hdc,0,0,maxX,maxY,memdc,0,0,SRCCOPY);
EndPaint(hwnd,&paintstruct); // DC
break;
case WM_DESTROY: // Завершение программы
DeleteDC(memdc); // Удалить виртуальное окно
PostQuitMessage(0);
break;
default:
// Все сообщения, не обрабатываемые в данной
// функции, направляются на обработку по
// умолчанию
return DefWindowProc(hwnd,message,
wParam,lParam);
return 0;
}
DWORD MyThread1(LPVOID param)
for(i=0; i<10; i++)
ReleaseSemaphore(hSema, 1, NULL);
return 0;
}
DWORD MyThread2(LPVOID param)
for(i=0; i<10; i++)
ReleaseSemaphore(hSema, 1, NULL);
return 0;
}
|