在响应按钮事件时,为何其他控件无法使用 我做了一个对话框程序,在响应按钮事件时(按钮事件里的程序执行时间较长),界面上的其他控件就无法使用了,而且事件中对其他控件属性的改变(如文本框内的文本)也要到线程结束时才显现。如何才能实现按钮事件响应时,其他控件的访问和其他控件属性的实时改变?是不是一定要用多线程?不用能实现吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VC++ MFC 多线程及线程同步http://blog.sina.com.cn/s/blog_4fd8460f01009aay.html if (IDOK == dlg.DoModal()){ ...}...表示在dlg对话框按了OK按钮之后才继续执行下面的语句,即此时界面上不能进行其他操作,被阻塞。可以直接使用dlg.DoModal();即不等待该对话框的操作结果,马上执行下面的操作。 http://www.vckbase.com里搜一下多线程,有好多例子的,祝你成功! 不要阻塞消息循环,如果需要更新界面,只需在代码中加入消息循环代码即可。m_edit.SetWindowText("abcd"); // 加入下面的消息循环代码,EDIT设置的文本就能更新MSG msg;while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) DispatchMessage(&msg); 多线程示例:UINT myThread(LPVOID lpParam){ ...... return 0;}//假设你的响应按钮事件函数为CMyDialog::OnClickBtn()void CMyDialog::OnClickBtn(){ .... AfxBeginThread(myThread, NULL);}afxBeginThread函数的第二个参数就是传递给myThread函数的值,上面的例子相当于myThread(NULL),你可以根据具体情况传递需要的参数。具体可参考 MSDN 中关于 afxBeginThread函数的用法。 hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc, pParam, dwFlags, &idThread) ; 第一个参数是指向SECURITY_ATTRIBUTES型态的结构的指标。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL。第二个参数是用於新执行绪的初始堆叠大小,预设值为0。在任何情况下,Windows根据需要动态延长堆叠的大小。 CreateThread的第三个参数是指向执行绪函式的指标。函式名称没有限制,但是必须以下列形式宣告: DWORD WINAPI ThreadProc (PVOID pParam) ; CreateThread的第四个参数为传递给ThreadProc的参数。这样主执行绪和从属执行绪就可以共用资料。 CreateThread的第五个参数通常为0,但当建立的执行绪不马上执行时为旗标CREATE_SUSPENDED。执行绪将暂停直到呼叫ResumeThread来恢复执行绪的执行为止。第六个参数是一个指标,指向接受执行绪ID值的变数。UINT ThreadProc(LPVOID lpParam) { //do something return 0; } 关于 USB 中定义的 GUID 线程中传递类成员 ado中的Close和Release什么意思?社那马区别? 如何创建或者切换活动文档视图? 如何提高服务器的效率? 問一個關于硬件方面的問題? 谁知道GIS,GPS,RS? 求购(socket)多线程原码,谢谢! 【求助】VC 6.0 又出问题了 关于SDK编程的几个巨难问题(对于我来说),高手和非高手请进-> CArchive操作文件产生的怪问题 关于ADO访问数据库的问题!
http://blog.sina.com.cn/s/blog_4fd8460f01009aay.html
{
...
}
...表示在dlg对话框按了OK按钮之后才继续执行下面的语句,即此时界面上不能进行其他操作,被阻塞。
可以直接使用dlg.DoModal();即不等待该对话框的操作结果,马上执行下面的操作。
祝你成功!
m_edit.SetWindowText("abcd"); // 加入下面的消息循环代码,EDIT设置的文本就能更新
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
DispatchMessage(&msg);
{
......
return 0;
}//假设你的响应按钮事件函数为CMyDialog::OnClickBtn()
void CMyDialog::OnClickBtn()
{
....
AfxBeginThread(myThread, NULL);
}afxBeginThread函数的第二个参数就是传递给myThread函数的值,上面的例子相当于myThread(NULL),你可以根据具体情况传递需要的参数。
具体可参考 MSDN 中关于 afxBeginThread函数的用法。
pParam, dwFlags, &idThread) ;
第一个参数是指向SECURITY_ATTRIBUTES型态的结构的指标。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL。第二个参数是用於新执行绪的初始堆叠大小,预设值为0。在任何情况下,Windows根据需要动态延长堆叠的大小。 CreateThread的第三个参数是指向执行绪函式的指标。函式名称没有限制,但是必须以下列形式宣告: DWORD WINAPI ThreadProc (PVOID pParam) ;
CreateThread的第四个参数为传递给ThreadProc的参数。这样主执行绪和从属执行绪就可以共用资料。 CreateThread的第五个参数通常为0,但当建立的执行绪不马上执行时为旗标CREATE_SUSPENDED。执行绪将暂停直到呼叫ResumeThread来恢复执行绪的执行为止。第六个参数是一个指标,指向接受执行绪ID值的变数。UINT ThreadProc(LPVOID lpParam)
{
//do something
return 0;
}