求高手写个MFC最简单的对话框中加个工作线程的小程序

2025年03月12日 20:53
有1个网友回答
网友(1):

MFC中开线程确实是个麻烦的问题,最大的问题在于开出来的线程函数不能直接使用MFC的一些机制,比如一个基于对话框工程,dlg cpp中写了一个线程函数,那么这个函数不能使用当前dlg类的所有成员,函数,所以直接调用控件变量是不行的,另外获取指针的方法也不行,只有在MFC类的成员函数中才能使用GetDlgItem( IDC_EDIT1 ),在其他函数中只能使用HWND GetDlgItem(HWND hDlg,int nIDDlgItem),使用后GetDlgItem( NULL,IDC_EDIT1 )->只弹出一个unused
当然办法还是有的,思路是先全局定义一些变量,在工作者线程中去不断改变变量的值,把变量值反馈给对话框的任务交给OnTimer(),因为你的要求是自动刷新,那么也就是每隔一定时间刷新,那么OnTimer()就必不可少了。
我给你个例子,要写的代码非常少就不发工程了,步骤如下
建一个基于对话框工程,添加一个按钮,一个editbox,editbox绑定一个control变量c_edit
然后在oninitdialog中加int iInstallResult;
iInstallResult=SetTimer(1,1,NULL);
同样是这个cpp文件中的开头加int num=0;(全局)
再在全局位置添加线程函数
UINT fun(LPVOID pParam)
{
while(1)
{
++num;
if(num>=1000) num=0;
}
return 0;
}
为按钮添加单击事件,加入代码AfxBeginThread(fun,NULL);
最后为对话框添加OnTimer事件,代码如下
CString s;
s.Format(_T("%d"),num);
c_edit.SetWindowTextW(s);
CDialog::OnTimer(nIDEvent);
这个程序运行后OnTimer就已经启动,会不断把num值写入editbox,点击按钮后,fun线程启动,不断累加num,直到1000时归零,也就是editbox不断在0-1000之间滚动

其实想想工作者线程中也并不需要MFC机制,能处理一些数据就可以了,标准cc++的库还是可以正常使用的,当然至于不能使用MFC的机制估计很有可能是我没发现用法,比如获取指针那里虽然只弹出一个unused,但是毕竟有这个函数有它的作用的,只不过我不知道用法而已,另外发送消息机制我是实在不会,也不知道能不能正常使用,不过不出意外估计也是不能直接拿来用的,不像mfc那么方便

这是开线程的一种思路,我也不知道一般软件开发这种情况是用的什么技术,至于怎么在线程中使用MFC机制,就看你有没有这个兴趣往那个方向去研究了