Handshake自动重置事件
事件等待实例(来自windows 核心编程)中文注释一遍,加深印象
#include "HandShare.h" // // 当客户端从服务端请求时 HANDLE g_hRequestSubmintted; // // 当服务端发送结果给客户端时 HANDLE g_hResultReturned; // // 缓冲区用于交换数据 TCHAR g_szShareRequestAndResultBuffer[1024]; // // 向客户端发送特殊的值,让服务端线程结束 TCHAR g_szServerShoutdown[] = TEXT("Server Shutdown"); // // server线程句柄 HANDLE hThreadServer; DWORD WINAPI ServerThread(PVOID pvParam) { BOOL bShoutDown = FALSE; while(!bShoutDown) { // // 等待用户单击按钮 WaitForSingleObject(g_hRequestSubmintted, INFINITE); // // 判断是不是要结束线程,不结束则处理数据 bShoutDown = (strcmpi(g_szShareRequestAndResultBuffer, g_szServerShoutdown) == 0); if (!bShoutDown) { _strrev(g_szShareRequestAndResultBuffer); } // // 通知客户端数据处理完毕 SetEvent(g_hResultReturned); } return 0; } BOOL InitEvent() { DWORD dwThreadID; // // 创建两个事件 自动重置。 g_hRequestSubmintted = CreateEvent(NULL, FALSE, FALSE, NULL); g_hResultReturned = CreateEvent(NULL, FALSE, FALSE, NULL); // // 创建一个服务端线程,等待用户单击按钮 hThreadServer = CreateThread(NULL, 0, ServerThread, NULL, 0, &dwThreadID); return TRUE; } BOOL EndEvent() { // // 客户端界面关闭,结束server thread 线程 // 复制Server Shutdown到缓冲区,通知一下server线程就可以结束 strncpy(g_szShareRequestAndResultBuffer, g_szServerShoutdown, strlen(g_szServerShoutdown)); SetEvent(g_hRequestSubmintted); // // 等待服务端线程关闭,使用WaitForSingleObject也可以。 HANDLE hArray[2]; hArray[0] = g_hResultReturned; hArray[1] = hThreadServer; WaitForMultipleObjects(2, hArray, TRUE, INFINITE); // // 扫尾 CloseHandle(hThreadServer); CloseHandle(g_hRequestSubmintted); CloseHandle(g_hResultReturned); return TRUE; } // // 单击submit按钮 // BOOL SubmitToServer(HWND hwnd) { // // 获取需要处理的内容到缓冲区 GetDlgItemText(hwnd, IDC_EDIT_Qequest, g_szShareRequestAndResultBuffer, sizeof(g_szShareRequestAndResultBuffer)); // // 通知道serverthread处理 SetEvent(g_hRequestSubmintted); // // 等待返回结果 WaitForSingleObject(g_hResultReturned, INFINITE); // // 将处理结果显示在Result上 SetDlgItemText(hwnd, IDC_EDIT_Result, g_szShareRequestAndResultBuffer); return TRUE; } BOOL CALLBACK Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //char szBuffer[MAX_PATH]; static HANDLE hThead; switch(uMsg) { case WM_INITDIALOG: { SetDlgItemText(hWnd, IDC_EDIT_Qequest, "input some data"); } return TRUE; case WM_CLOSE: EndDialog(hWnd, 0); return TRUE; case WM_COMMAND: switch ( LOWORD(wParam) ) { case IDC_BUTTON_Submite: { SubmitToServer(hWnd); } return TRUE; }//end switch return FALSE; } return FALSE; } int WINAPI _tWinMain( IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN int nShowCmd ) { InitEvent(); DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOGMAIN), NULL, Dlg_Proc); EndEvent(); return (0); }
运行效果: 单击按钮后返回反转后的字符串

2012-11-13

浙公网安备 33010602011771号