一个对话框程序
用CWinThread派生了一个类CtrDevices
要实现CtrDevices类向主线程发消息
//**CtrDevices.CPP**//
BOOL CtrDevices::InitDevice()
{
m_hThreadQuery = ::CreateThread(
NULL,
0,
ThreadQuery,
this,
0,
&m_dwThreadIdQuery);
return TRUE;}
BOOL CtrDevices::ProcessLoop()
{
while (1)
::PostThreadMessage(m_dwThreadIdQuery,WM_DVM_QUERY,NULL,NULL);//给线程ThreadQuery发送WM_DVM_QUERY消息
}
unsigned long WINAPI ThreadQuery(PVOID pvoid)
{
MSG msg; PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); BOOL bRet; while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if(msg.message == WM_DVM_QUERY)
{
CString* s_tmp=new CString;
s_tmp->Format(_T("进入ThreadQuery线程"));
::PostMessage((HWND)((CImageProDlg*)AfxGetMainWnd())->GetSafeHwnd(),WM_DISPLAY,NULL,(LPARAM)s_tmp);//给主对话框发送自定义WM_DISPLAY消息 }
} return 0;
}
//**ImageProDlg.h**(主线程)中//
#define WM_DISPLAY WM_USER+2 //自定义消息
protected:
LRESULT ReceiveDataSet(WPARAM wParam,LPARAM lParam);//响应函数
//**ImageProDlg.CPP**(主线程)中//
BEGIN_MESSAGE_MAP(CImageProDlg, CDialog)
......
ON_MESSAGE(WM_DISPLAY,ReceiveDataSet)//添加消息映射END_MESSAGE_MAP()
//**自定义消息相应函数**//
LRESULT CImageProDlg::ReceiveDataSet(WPARAM wParam,LPARAM lParam)
{
CString* sTemp=(CString*)lParam;
CString temp=* sTemp;
UpdateData();
temp=m_str_edit+temp+scl;//m_str_edit是一个EDIT控件关联的CString变量
m_str_edit=temp;
UpdateData(false);
return 0;}//**按钮单击相应**//
void CImageProDlg::OnBnClickedButton2()
{
CtrDevices* m_pCtrDevices;
m_pCtrDevices=
(CtrDevices*)AfxBeginThread(RUNTIME_CLASS(CtrDevices));
m_pCtrDevices->InitDevice();
m_pCtrDevices->ProcessLoop();
}按正常的话主对话框的编辑框会显示"进入ThreadQuery线程"字符串,但是调试的过程中 程序停在了PostMessage((HWND)((CImageProDlg*)AfxGetMainWnd())->GetSafeHwnd(),WM_DISPLAY,NULL,(LPARAM)s_tmp);函数上面。跳不到主对话框的消息相应函数ReceiveDataSet上 ,也就是说消息没有发送到主窗口。
请大家指教啊
用CWinThread派生了一个类CtrDevices
要实现CtrDevices类向主线程发消息
//**CtrDevices.CPP**//
BOOL CtrDevices::InitDevice()
{
m_hThreadQuery = ::CreateThread(
NULL,
0,
ThreadQuery,
this,
0,
&m_dwThreadIdQuery);
return TRUE;}
BOOL CtrDevices::ProcessLoop()
{
while (1)
::PostThreadMessage(m_dwThreadIdQuery,WM_DVM_QUERY,NULL,NULL);//给线程ThreadQuery发送WM_DVM_QUERY消息
}
unsigned long WINAPI ThreadQuery(PVOID pvoid)
{
MSG msg; PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); BOOL bRet; while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
{
if(msg.message == WM_DVM_QUERY)
{
CString* s_tmp=new CString;
s_tmp->Format(_T("进入ThreadQuery线程"));
::PostMessage((HWND)((CImageProDlg*)AfxGetMainWnd())->GetSafeHwnd(),WM_DISPLAY,NULL,(LPARAM)s_tmp);//给主对话框发送自定义WM_DISPLAY消息 }
} return 0;
}
//**ImageProDlg.h**(主线程)中//
#define WM_DISPLAY WM_USER+2 //自定义消息
protected:
LRESULT ReceiveDataSet(WPARAM wParam,LPARAM lParam);//响应函数
//**ImageProDlg.CPP**(主线程)中//
BEGIN_MESSAGE_MAP(CImageProDlg, CDialog)
......
ON_MESSAGE(WM_DISPLAY,ReceiveDataSet)//添加消息映射END_MESSAGE_MAP()
//**自定义消息相应函数**//
LRESULT CImageProDlg::ReceiveDataSet(WPARAM wParam,LPARAM lParam)
{
CString* sTemp=(CString*)lParam;
CString temp=* sTemp;
UpdateData();
temp=m_str_edit+temp+scl;//m_str_edit是一个EDIT控件关联的CString变量
m_str_edit=temp;
UpdateData(false);
return 0;}//**按钮单击相应**//
void CImageProDlg::OnBnClickedButton2()
{
CtrDevices* m_pCtrDevices;
m_pCtrDevices=
(CtrDevices*)AfxBeginThread(RUNTIME_CLASS(CtrDevices));
m_pCtrDevices->InitDevice();
m_pCtrDevices->ProcessLoop();
}按正常的话主对话框的编辑框会显示"进入ThreadQuery线程"字符串,但是调试的过程中 程序停在了PostMessage((HWND)((CImageProDlg*)AfxGetMainWnd())->GetSafeHwnd(),WM_DISPLAY,NULL,(LPARAM)s_tmp);函数上面。跳不到主对话框的消息相应函数ReceiveDataSet上 ,也就是说消息没有发送到主窗口。
请大家指教啊
解决方案 »
- 如何给窗口添加右下角拖动大小箭头啊??
- 求<VC-MFC扩展编程实例>的源代码,万分感谢
- 用TCP建立连接后,当对方已经断掉后SEND数据会怎么样?
- 在vc++6.0中调试程序时出现的问题,高手指教!!!!!!!!
- 又有人例分。
- 如何用vc 将Msrdp59.lib的静态库 转化为java能调用的动态库dll !急用!
- 菜菜小问题,vc下如何定义静态二维数组,放哪呢?我放到,头文件里不对,怎么放好呢?
- 如何编写DLL调用远程机器中的另一个DLL?
- vc6.0 ,对话框控件的文字变乱码,位图位置错位。
- 用别人的类
- ResHacker使用命令行替换指定的字符串
- 不知道我这个问题在这问合适不合适。。。
2。将主窗口指针或句柄传给ThreadQuery函数参数
(CImageProDlg*)AfxGetMainWnd())->GetSafeHwnd()
是不是有效的postmessage他不知道该发给谁
::SendMessage(AfxGetApp()->GetMainWnd()->GetSafeHwnd(),WM_DISPLAY,NULL,(LPARAM)s_tmp1);
结贴散分!