最近学习多线程方面的知识,网上下载的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;
原因自己查吧,也是个学习的过程!!!
希望此文能让哪些向我一样的初学者不在被这几个问题折腾!!!
最后,希望大家在论坛遇到问题,如果自己解决了就给大家共享一下,大家会记着你的好的!!!