0
点赞
收藏
分享

微信扫一扫

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


李国帅

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

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

如果用户需要一个定义整个系统唯一的消息,可以调用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


我这样测了一个消息

窗口


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;
}

举报

相关推荐

0 条评论