转:MFC 多线程通信 MultiThread7实例

最近学习多线程方面的知识,网上下载的MultiThread7的源代码,在VC6.0里面运行没有问提,直接从VC6.0转到VS2005也没有什么问题,都可以成功运行并得到结果。                      但是,自己动手在VS2005新建工程实现相同的功能确遇到了问题。

第一个是:

errorC2440: “static_cast”:无法从“LONG (__thiscall CCalculateThread::*)(UINT,LONG)”转换为“void(__thiscall CWinThread::* )(WPARAM,LPARAM)”

这个简单,直接将函数afx_msg  LONG OnCalculate(UINTwParam,LONG lParam); 的返回值改为void即可编译通过。

但是编译通过了但是第二个问题又出来了………………

第二个是:

 当你满以为自己搞定了,准备验证一下结果是否正确的时候,却又被当头泼了一盘冷水,一个莫名其妙的错误把你刚才的信息击了个粉碎。(如图)

 

内存不足!!!不错,C++最怕这样的错误,内存泄露了?指针没有释放?不对呀!刚点击求和按钮就内存不足了?是不是电脑配置太低?郁闷啊……………………

 

这个问题倒也不难解决,再认真检查了程序里面不存在指针不释放的情况之后,开始寻找其它可能情况,最后发现是缺少DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏导致的。

具体是为什么可以自己查一下资料。

解决办法:

1、在CalculateThread.h文件的classCCalculateThread中加入DECLARE_DYNCREATE(CCalculateThread)

classCCalculateThread :public CWinThread

{

DECLARE_DYNCREATE(CCalculateThread)

…………………………

…………………………

}

2、在CalculateThread.cpp文件中加入IMPLEMENT_DYNCREATE(CCalculateThread,CWinThread)

 

这下没有问题了吧,编译通过了,运行也不会报错了,可以跑起来了吧!!!哈哈哈……高兴的未免有点儿早了吧?结果出不来?没错,就是结果出不来!!!继续努力吧您…………

这就TMD比较郁闷了,不报错了就是不出结果!!!刚开始考虑是自定义的两个消息WM_CALCULATE和 WM_DISPLAY没有发送成功,是哪一个呢?

通过抓阄确定消息WM_CALCULATE没有发送成功的可能性较大!!!那就搞个函数验证一下吧:

在类CCalculateThread中加了个函数void OnCalculate2(int liujun);

voidCCalculateThread::OnCalculate2(int liujun)

{

     CStringsumStr;

     int nTmpt=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,咱不用消息驱动了!!!

 

voidCMultiThread7Dlg::OnBnClickedSum()

{

     // TODO: 在此添加控件通知处理程序代码

     m_pCalculateThread= (CCalculateThread*)AfxBeginThread(RUNTIME_CLASS(CCalculateThread));

     m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);

 

     CCalculateThreadTheCalculateThread;

     TheCalculateThread.OnCalculate2(nAddend);//直接调用函数

}

结果怎么样呢?

 

不错,结果出来了,看来抓阄有时候还是很好用的!!!这就说明这句没有问题,消息WM_DISPLAY发送成功了。

::PostMessage((HWND)(GetMainWnd()->GetSafeHwnd()),WM_DISPLAY,nTmpt,NULL);

 

那就是消息WM_CALCULATE没有成功发出去,那就是下面这个出问题了,它失败了!!

m_pCalculateThread->PostThreadMessage(WM_CALCULATE,nAddend,NULL);

但是,在调试状态跟进去也没有跟出个所以然来!!!这下彻底抓狂了,在网上搜了一个下午没有找到答案,倒是有几个遇到了相同的问题,但是最终没有给出答案!!!让我气愤的是,有个哥哥遇到相同的问题,到论坛上求助。大家都积极给这位老兄支招,最后这位大哥说他自己解决了,但是却没有说是怎么解决的!!!把我气的就差骂娘了,最讨厌这种做法,有问题来论坛求助,解决了就自个儿偷着乐,对这种人真是无语了!!!

一时气愤,发了点儿牢骚!!!祈求原谅中………………

  接着说,最后这个问题折腾的时间不短,但是其实挺容易解决的。

BOOL CCalculateThread::InitInstance()

{

     // TODO: 在此添加专用代码和/或调用基类

//return CWinThread::InitInstance();

     return TRUE;

}

 

没有错!!!将默认的returnCWinThread::InitInstance();换成return TRUE;就OK了!!

其实跟进去看看就会发现,函数InitInstance()屁没有做,就是直接return FALSE;所以我们就直接

return TRUE;

 

原因自己查吧,也是个学习的过程!!!

希望此文能让哪些向我一样的初学者不在被这几个问题折腾!!!

最后,希望大家在论坛遇到问题,如果自己解决了就给大家共享一下,大家会记着你的好的!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值