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

 

posted @ 2012-11-13 17:33  markro  阅读(143)  评论(0)    收藏  举报