zaodt:写的非常好,这真是菜鸟们的福音,例子也非常好,简单易懂!非常感谢作者,希望能写出更多的好文章!
这里,我找一个很小的缺陷:在MFC工作线程函数中,int nTemp=pInfo->nMilliSecond; 放到 for 语句前更合适。
---- 杭州 至尊宝 zaodt_ms@hotmail.com
(发表于2006-11-15 10:23:00)
梦龙:的确非常不错。完整的看过文章,并且按照例子做下来,就基本上掌握了多线程!
(发表于2006-11-15 21:18:00)
fengminggao:各位大哥,在MultiThread6中如何处理在进程没退出之前,终止线程的执行(用户界面线程窗口已关闭,但是线程还存活 spy++可查看)。
(发表于2006-12-6 22:08:00)
hongjie7117:Detected memory leaks!
Dumping objects ->
D:\MultiThread6\UIThread.cpp(17) : {84} client block at 0x00422DE0, subtype 0, 208 bytes long.
a CUIThread object at $00422DE0, 208 bytes long
Object dump complete.
好象例子6中有内存泄露
(发表于2007-8-31 14:46:00)
hongjie7117:代码中
int CUIThread::ExitInstance()
{
m_dlg.DestroyWindow();
return CWinThread::ExitInstance();
}
不会被执行所以导致内存泄露。
可以在void CUIThreadDlg::OnOK()
{
// TODO: Add extra validation here
CDialog::OnOK();
DestroyWindow();
}
void CUIThreadDlg::OnCancel()
{
// TODO: Add extra cleanup CDialog
CDialog::OnCancel();
DestroyWindow();
}
增加DestroyWindow();来销毁对象;
或者在CUIThread中声明的CUIThreadDlg指针来操作;
在void CUIThreadDlg::OnDestroy()
{
CDialog::OnDestroy();
delete this;
// TODO: Add your message handler code here
}
调用delete this;
总之要把Create出的对象调用DestroyWindow()
来销毁
作者用的
ExitInstance里销毁 那么就要自己重载Run函数在内部进行处理消息来调用ExitInstance
(发表于2007-8-31 15:20:00)
badboyfind:你们说的错误在下面
m_dlg.Create(IDD_UITHREADDLG); //此处为错误
m_dlg.ShowWindow(SW_SHOW);
m_pMainWnd=&m_dlg;
一定要记得,在创建非模态对话框的时候,要new出来的对话框才需要DestroyWindow(),然后再在PostNcDestroy()中delete this;
建议阅读下面的文章:
http://hi.baidu.com/listenprogram/blog/item/4902d5c62e005f1f9c163d86.html
(发表于2008-3-19 9:13:00)
badboyfind:改正为
CUIThreadDlg *m_dlg = new CUIThreadDlg();
m_dlg->Create(IDD_UI_MUTITHREAD_DLG);
m_dlg->ShowWindow(SW_SHOW);
m_pMainWnd=m_dlg;
然后在CUIThreadDlg类中重载OnCancel(),调用DestroyWindow(),重载PostNcDestroy()中delete this;这样可以完全释放资源
(发表于2008-3-19 9:25:00)
badboyfind:如果不new出的非模态对话框
则m_dlg.Create(IDD_UITHREADDLG); //此处为错误
m_dlg.ShowWindow(SW_SHOW);
m_pMainWnd=&m_dlg;
然后在CUIThreadDlg 类中重载OnCancel(),调用DestroyWindow()即可,而无需再调用CDialog::Oncancel(). 不要重载PostNcDestroy()中delete this;这样可以完全释放资源。
这样int CUIThread::ExitInstance()
{
m_dlg.DestroyWindow();
return CWinThread::ExitInstance();
}
中的m_dlg.DestroyWindow();就不要需要了
(发表于2008-3-19 9:38:00)
..........................................................................
--------------------next---------------------