在对话框CPP中,启动了一个线程。在线程中有操作对话框的动作。
测试代码:void CTestDlg::OnOK()
{
DWORD dwThread = 0;
HANDLE hHandle = CreateThread(NULL,0,MyFun,(LPVOID)this,dwThread);
if( WAIT_OBJECT_0 == WaitForSingleObject(hHandle,INFINIT) )//这个地方卡住,好像死循环了。
{
//继续操作;
}
}
DWORD WINAPI CTestDlg::MyFun(LPVOID lParam)
{
//访问对话框资源
CMyDlg* pDlg = (CMyDlg*)lParam;
pDlg->m_List.DeleteAllItems();
//...
//...
}
在Wait线程的时候就出不来了,一直等待。调试了一下,发现是线程中操作了控件造成的。
请问大家如何解决这个问题?尽量可以让我的线程操作资源,然后正常等待。
测试代码:void CTestDlg::OnOK()
{
DWORD dwThread = 0;
HANDLE hHandle = CreateThread(NULL,0,MyFun,(LPVOID)this,dwThread);
if( WAIT_OBJECT_0 == WaitForSingleObject(hHandle,INFINIT) )//这个地方卡住,好像死循环了。
{
//继续操作;
}
}
DWORD WINAPI CTestDlg::MyFun(LPVOID lParam)
{
//访问对话框资源
CMyDlg* pDlg = (CMyDlg*)lParam;
pDlg->m_List.DeleteAllItems();
//...
//...
}
在Wait线程的时候就出不来了,一直等待。调试了一下,发现是线程中操作了控件造成的。
请问大家如何解决这个问题?尽量可以让我的线程操作资源,然后正常等待。
解决方案 »
- MFC中一个非模态对话框下,怎么操作另一个非模态对话框中的CTreectrl控件……
- 如何正确显示一个网页?
- 我想创建一个CSplitterWnd类的派生类,采用的是MFC的"insert->new class",选的基类Splitter,但自动生成的代码是这样的class Splitter1 :
- 一个简单的rpc程序的服务器段出现的错误,是什么原因?
- 知道IHTMLDocument2接口,怎么得到一个网页的所有文本内容??
- 关于打印的时候应该如何设置映射模式的问题……
- 谁能告诉我如何录制和播放PCM格式文件?
- mfc程序怎么老是有错,但不知道错在什么地方,请高手帮忙谢谢
- 在客户区无效以后,怎么样使客户区有效使之能接受键盘输入??
- 下面代码可以直接访问网页,但我想让它能通过代理服务器访问,如何通过用户验证?
- 求救:连Web Service接口报错(VC+gsoap开发)
- HOOK 恢复的问题
HANDLE hHandle = CreateThread(NULL,0,MyFun,(LPVOID)this,dwThread);
CMyDlg* pDlg = (CMyDlg*)lParam;
不能这么转换的,你传CTestDlg窗口类指针必须转成CTestDlg窗口类指针指针
CTestDlg* pDlg = (CTestDlg*)lParam;
如果在线程中发消息出去,改动代码很大。
如:
CMyDlg::OnStart()
{
m_testDlg.OnOk();
}
CTestDlg::OnOk()
{
//HdThread是封装好的线程对象
m_HdThread.StartWork(Work,(LPVOID)this);//Work是线程函数
m_HdThread.Wait();//等待
}
比如:
m_List.DeleteAllItems();
这里就停住了。想这种问题需要用什么方法来解决?
比如
sendMessage(Id)在外面处理
是在响应对话框的ok消息,但是由于组赛,这个消息没有执行完。
而DeleteAllItems其实也需要想控件发送消息,而且是通过sendmessage,但是由于ok这个消息没有处理完,所以有DeleteAllItems发出的消息就得不到响应,所以DeleteAllItems就不会返回,造成死锁
好了,结贴给分。