自定义线程1中加入Sleep()之类的
还有不要在线程里写ListBox,最好是SendMessage给主线程。
还有不要在线程里写ListBox,最好是SendMessage给主线程。
解决方案 »
- 用Windows如何实现士兵站队问题(急)
- 界面中用函数实现界面贴图让界面美观点,但是控件却显示不出来了!!
- omni CORBA编译报错
- 为什么我的IE6打开不了?
- 怎样删除文本中内容相同的行?
- 急!!! 如果在非客户区创建一个窗口.
- 为什么我在辅助线程中无法创建文件、使用COMMTIMEOUTS 结构? error C2018: unknown character '0xa1'
- 怎么把一个char型的IP赋值给一个CIPAddressCtrl的类?
- 请教TrackMouseEvent函数
- 请问现在c/s的程序,客户段和服务器段通信,一般又些什么技术啊??比如tcp/ip,dcom,soap,大家能慷慨发炎嘛?
- 关于指针.
- API 写的编辑器的屏幕刷新问题
zero100()兄所言极是,不要在线程里直接修改ListBox.如果多个线程同时要求修改Listbox,这才是你要考虑的同步问题.
多线程大多用在很复杂的数学运算时才考虑,向ListBox循环写入信息不如给主线程投递消息PostMessage
我看到微软的例程里虽然启动多个线程,也仍然可以接受用户事件,可是我的程序为什么不能呢?
是不是我的线程有什么问题?
CThread1* pt1;
pt1 = new CThread1();
// pt1 = (CThread1*)AfxBeginThread(RUNTIME_CLASS(CThread1),THREAD_PRIORITY_LOWEST,0,0,NULL);
if(!pt1->CreateThread(CREATE_SUSPENDED,0))
{
delete pt1;
return;
}
pt1->SetOwner(this);
pt1->SetThreadPriority(THREAD_PRIORITY_HIGHEST);
pt1->ResumeThread();
pt1->testfun();
请各位大侠多多指教
1、(CThread1*)AfxBeginThread(RUNTIME_CLASS(CThread1),THREAD_PRIORITY_LOWEST,0,0,NULL);函数为你自动分配一个CThread1对象,并且创始化它,你不用调用pt1 = new CThread1();和pt1->CreateThread()。如果要创建后挂起,把dwCreateFlags设为CREATE_SUSPENDED就行了。结束线程时将会自动删除分配的CThread1对象。
注,AfxBeginThread内部代码相当于执行了:
CThread1 pThread = new CThread1;
pThread->CreateThread(...)
终止时调用了pThread->Delete()删除了RUNTIME对象
2、pt1->testfun();是什么意思?如果要执行线程函数,pt1->ResumeThread();后线程函数将自动被子线程执行,不用自己调用(那样在主线程中又执行了一次)。
最后,这段程序可以改为这样
(不用重载CWinThread类):
CWinThread* pThread = AfxBeginThread(YourThreadProc,(LPVOID)pYourThreadProcParam, THREAD_PRIORITY_HIGHEST, 0, CREATE_SUSPENDED, NULL);
//在这做你的运行前处理...
pThread->ResumeThread();
//就行了,如果要在主线程中检测线程是否结束,可以调用
if(WaitForSingleObject(pThread->m_hThread, 0) == WAIT_OBJECT_0) {
//子线程已经结束。
}
else {
//子线程尚未结束。
}
如果需要重载CWinThread类的话,注意运行时为m_pfnThreadProc和m_pThreadParams类成员赋以有效值。然后:
CYourThread pThread = (CYourThread*)AfxBeginThread(RUNTIME_CLASS(CYourThread),THREAD_PRIORITY_HIGHEST,0,CREATE_SUSPENDED,NULL);
和:
CYourThread pThread = new CYourThread;
pThread->CreateThread(CREATE_SUSPENDED,0,0);
都可以。。
其它的细致部分看看MSDN中的Res吧,相信会很有帮助的。
此外,漏了一点如果是直接用CWinThread要在构造函数中传入m_pfnThreadProc和m_pThreadParams。即:
CWinThread pThread = new CWinThread(YourThreadProc,(LPVOID)pYourThreadParams);
pThread->CreateThread(CREATE_SUSPENDED,0,0);
当然,对于自己重载的CXXThread类,也可以在其他地方给CWinThread::m_pfnThreadProc和CWinThread::m_pThreadParams类成员赋值。