读书人

关于MFC多线程中对控件变量的访问有关

发布时间: 2013-01-11 11:57:35 作者: rapoo

关于MFC多线程中对控件变量的访问问题
小弟今日写一漏洞扫描的课设,在利用MFC设计界面中遇到一个小问题,恳求大家帮忙出出主意。
我利用createThread创建了一个线程,当然啦,主线程肯定是用来绘图的,然后创建的线程里面主要就是各种扫描函数(端口扫描,服务器扫描),但是在创建的线程中我要将扫描过程中一步步的结果显示到屏幕上去,这就自己写了一个函数Chole30Dlg::ScanSendMeg(CString TempBuf),它的作用就是将TempBuf中的内容送到指定地方,具体如下:
bool Chole30Dlg::ScanSendMeg(CString TempBuf)
{
CString strTemp;
Chole30Dlg::FindWindow(NULL,"hole3.0")->GetDlgItemTextA(IDC_SCANPROC,strTemp);
strTemp+="\r\n";
strTemp+=TempBuf;
Chole30Dlg::FindWindow(NULL,"hole3.0")->SetDlgItemTextA(IDC_SCANPROC,strTemp);
Chole30Dlg::m_ScanResult.LineScroll(Chole30Dlg::m_ScanResult.GetLineCount());//此处出错了。。。error C2228: “.LineScroll”的左边必须有类/结构/联合
1>g:\mfc\hole4.0\hole3.0\hole3.0dlg.cpp(628) : error C2228: “.GetLineCount”的左边必须有类/结构/联合。。。m_ScanResult为一个关联的一个CEDIT控件变量
return true;
}
上面的函数是在创建的线程中被反复调用。。。。
我知道在创建线程时可以把对话框的指针传进去这样就可以在线程中去对对话框发送消息了,可是没有相关的实例,我悟性不佳,恳求大家帮个忙,看看怎么解决哈,有什么不明白的我回来尽快回复,谢谢~
[解决办法]
光看报错楼主
m_ScanResult是指针的样子


m_ScanResult->GetLineCount()
看看
[解决办法]
建议你使用往你的Dialog发消息的方式将数据传递过去,在对话框的响应函数里处理和显示。

另:跨线程访问窗口对象是不安全的,微软对此有说明
[解决办法]
楼主可以通过自定义消息的形式把扫描结果传递给主窗口。在创建线程的时候把窗口的指针作为参数。然后在线程函数开头直接用一个普通的CWnd *pWnd=(CWnd *)lpParam;就可以传递消息。
传递方法:先定义一个自定义消息宏,比如#define WM_MY_MSG WM_USER+100
接着重载主窗口的虚函数OnWndMsg
最后,在线程函数中要发送消息的地方,调用pWnd->SendMessage(WM_MY_MSG,...,...);后面2个参数可以是指针也可以是一个普通的数值型变量,把要传递的数据或者其指针做参数就能传递数据了。这样主窗口的OnWndMsg会响应,在这里把得到的数据放到窗口中吧

读书人网 >VC/MFC

热点推荐