避免其它进程被阻塞而造成系统死等VC



李国帅编2006.8


最简单的方法是这样使用,这样就不用担心因为子窗口阻塞导致系统无法销毁。

在发送端和接收端都首先要定义消息

如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage定义消息:

//注册的方法在两个地方都要注册。
static UINT WM_MY_MESSAGE = RegisterWindowMessage("User");
UINT   UM_MESSAGEID = ::RegisterWindowMessage(_T("Message   description"));

  并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令。

或者直接定义一个消息id,用户自定义消息至少是WM_USER+100,可以放在resource.h中。

#define UM_MESSAGEID WM_USER + 500

算法部分

在需要发消息的地方使用 SendMessage 或者 PostMessage

窗口部分

在类头文件的AFX_MSG块中定义消息处理函数

// {{AFX_MSG(CMainFrame)
LRESULT OnUserMessagexxx(WPARAM wParam, LPARAM   lParam);
//afx_msg LRESULT  OnUserMessagexxx(WPARAM wParam, LPARAM lParam);
//afx_msg宏表示声明的是一个消息响应函数。
//}}AFX_MSG
DECLARE_MESSAGE_MAP()

  实现消息处理函数,该函数使用WPRAM和LPARAM参数并返回LPESULT
LRESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam) {
    // TODO: 处理用户自定义消息
    //...
        return 0;
}

第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。

将消息和该函数绑定

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    //{{AFX_MSG_MAP(CMainFrame)
    ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage) //非注册方法
    ON_REGISTERED_MESSAGE(UM_MESSAGEID, OnUserMessagexxx)//注册方法
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

我这样测了一个消息

窗口

afx_msg LRESULT OnUMGrabInfo(WPARAM wParam, LPARAM lParam);//.h
ON_MESSAGE(UM_INFOID, OnUMGrabInfo) //非注册方法    //.cpp

#define UM_INFOID        WM_USER + 1979//    resource.h
发送类

告知目标窗口需要关闭

SendMessage(m_hInfoWnd, UM_INFOID, NULL, NULL);

DWORD result;
SendMessageTimeout(wnd->m_hWnd, // 目标窗口
    WM_MY_MESSAGE, // 消息
    0, // WPARAM
    0, // LPARAM
    SMTO_ABORTIFHUNG |    SMTO_NORMAL,
    TIMEOUT_INTERVAL,
    &result);

以避免其它进程如果被阻塞而造成系统死等状态。

//wParam通常传递全局对象指针,lParam传递一个临时指针,在vc中都一样,但是在其他的语言只有lparam能够正确传递。

LRESULT CGWServerTestDlg::OnLoginMsg(WPARAM wParam, LPARAM lParam)
{
    if (wParam != NULL)
    {
        if ((LONG_PTR)lParam == 1)
        {
            //CGWServerTestDlg* p = (CGWServerTestDlg*)wParam;
            //CString strInfo =(char*)wParam;
            return 0;
        }
    }
    return 0;
}

参考网友的文章

http://www.cnblogs.com/skywatcher/p/3506158.html

你可能感兴趣的:(C/C++)