//Листинг 6.7. Синхронизация потоков объектом Event #include struct STR { int k; char *p;}; HANDLE hEvent; ///////////////////////////////////////// unsigned __stdcall MyThread1(void* param) { ((STR*)param)->p = new char[((STR*)param)->k]; SetEvent(hEvent); return 0; } unsigned __stdcall MyThread2(void* param) { WaitForSingleObject(hEvent, INFINITE); for (int i = 0; i < ((STR*)param)->k; i++) ((STR*)param)->p[i] = '\0'; SetEvent(hEvent); return 0; } //////////////////////////////////////////////// LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { PAINTSTRUCT ps; HDC hdc; TCHAR str [100]; static HANDLE hThread1, hThread2; static STR mem = {2500000, NULL}; switch (message) { case WM_CREATE: hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); hThread1 = (HANDLE) _beginthreadex(NULL, 0, MyThread1, &mem, 0, NULL); hThread2 = (HANDLE) _beginthreadex(NULL, 0, MyThread2, &mem, 0, NULL); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); _stprintf(str, _T("Память выделена по адресу: %р"), mem.p); TextOut(hdc, 0, 0, str, _tcslen(str)); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc (hWnd, message, wParam, lParam); } return 0; }