欢迎来到天天文库
浏览记录
ID:9003928
大小:45.02 KB
页数:3页
时间:2018-04-14
《多线程实例multithread7在vs2005中实现》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、最近学习多线程方面的知识,网上下载的MultiThread7的源代码,在VC6.0里面运行没有问提,直接从VC6.0转到VS2005也没有什么问题,都可以成功运行并得到结果。但是,自己动手在VS2005新建工程实现相同的功能确遇到了问题。第一个是:errorC2440:“static_cast”:无法从“LONG(__thiscallCCalculateThread::*)(UINT,LONG)”转换为“void(__thiscallCWinThread::*)(WPARAM,LPARAM)”这个简单,直接将函数afx_msgLONGOnCalculate(UINTw
2、Param,LONGlParam);的返回值改为void即可编译通过。但是编译通过了但是第二个问题又出来了………………第二个是:当你满以为自己搞定了,准备验证一下结果是否正确的时候,却又被当头泼了一盘冷水,一个莫名其妙的错误把你刚才的信息击了个粉碎。(如图)内存不足!!!不错,C++最怕这样的错误,内存泄露了?指针没有释放?不对呀!刚点击求和按钮就内存不足了?是不是电脑配置太低?郁闷啊……………………这个问题倒也不难解决,再认真检查了程序里面不存在指针不释放的情况之后,开始寻找其它可能情况,最后发现是缺少DECLARE_DYNCREATE和IMPLEMENT_DYNC
3、REATE宏导致的。具体是为什么可以自己查一下资料。解决办法:1、在CalculateThread.h文件的classCCalculateThread中加入DECLARE_DYNCREATE(CCalculateThread)classCCalculateThread:publicCWinThread{DECLARE_DYNCREATE(CCalculateThread)……………………………………………………}2、在CalculateThread.cpp文件中加入IMPLEMENT_DYNCREATE(CCalculateThread,CWinThread)这下没有
4、问题了吧,编译通过了,运行也不会报错了,可以跑起来了吧!!!哈哈哈……高兴的未免有点儿早了吧?结果出不来?没错,就是结果出不来!!!继续努力吧您…………这就TMD比较郁闷了,不报错了就是不出结果!!!刚开始考虑是自定义的两个消息WM_CALCULATE和WM_DISPLAY没有发送成功,是哪一个呢?通过抓阄确定消息WM_CALCULATE没有发送成功的可能性较大!!!那就搞个函数验证一下吧:在类CCalculateThread中加了个函数voidOnCalculate2(intliujun);voidCCalculateThread::OnCalculate2(int
5、liujun){CStringsumStr;intnTmpt=0;for(inti=0;i<=liujun;i++){nTmpt=nTmpt+i;}sumStr.Format(_T("%d"),nTmpt);//向主线程发送消息WM_DISPLAY::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);//return;}在文件CMultiThread7Dlg.cpp中求和按钮的消息响应函数中直接调用函数OnCalculate2,咱不用消息驱动了!!!voidCMultiThre
6、ad7Dlg::OnBnClickedSum(){//TODO:在此添加控件通知处理程序代码m_pCalculateThread=(CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);CCalculateThreadTheCalculateThread;TheCalculateThread.OnCalculate2(nAddend);//直接调用函数}结果怎么样
7、呢?不错,结果出来了,看来抓阄有时候还是很好用的!!!这就说明这句没有问题,消息WM_DISPLAY发送成功了。::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);那就是消息WM_CALCULATE没有成功发出去,那就是下面这个出问题了,它失败了!!m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);但是,在调试状态跟进去也没有跟出个所以然来!!!这下彻底抓狂了,在网上搜了一个下午
此文档下载收益归作者所有