ALTE DOCUMENTE
|
|||||||
Как уже отмечалось, события используются д 21521g65v ля того, чтобы сообщить потокам или процессам о возникновении определенной ситуации. Для создания объекта события используется функция API CreateEvent
HANDLE CreateEvent LPSECURITY ATTRIBUTES lpAttr
BOOL Manual, BOOL Initial,
LPSTR lpszName};
lpAttr Windows NULL Manual TRUE ResetEvent Initial TRUE FALSE
lpszName NULL
CreateEvent NULL
WaitForSingleobject задавая в качестве первого параметра для нее дескриптор этого события. Тем самым выполнение процесса или потока приостанавливается д 21521g65v о наступления соответствующего события.
SetEvent
BOOL SetEvent HANDLE hEventObject
hEventObject является д 21521g65v ескриптором ранее созданного события. После вызова функции SetEvent WaitForSingleObject
HANDLE hEvent WM CREATE
hEvent = CreateEvent(NULL, FALSE, FALSE,"Myevent");
MyThread MyThread
DWORD MyThread LPVOID param
for(i=0; i<10; i++)
return
}
DWORD MyThread2(LPVOID param)
// Послать информацию о событии
SetEvent hEvent
return
}
MyThreadl MyThread
#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 hEvent; //
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,1); //Сообщить
// Порождение нового процесса
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++)
return
}
DWORD MyThread2(LPVOID param)
// Послать информацию о событии
SetEvent hEvent
return
}
|