MFC 如何判断线程还在执行呢?

是在有点没辙了,又来找你帮忙了!这是我的工作线程(这个代码直接将刚刚创建的线程关闭了,根本不执行)!我怎么判断创建了多个线程,关闭前一个呢,再重新创建一个新线程!for(... 是在有点没辙了,又来找你帮忙了!
这是我的工作线程(这个代码直接将刚刚创建的线程关闭了,根本不执行)!
我怎么判断创建了多个线程,关闭前一个呢,再重新创建一个新线程!
for(;;){
DWORD dwRetVal = 0;
dwRetVal = WaitForSingleObject(mThreadInfo.athread_A1,10);
if( dwRetVal != WAIT_TIMEOUT){
DWORD dwExitCode;
GetExitCodeThread( mThreadInfo.pWnd1->m_hWnd, &dwExitCode );
AfxEndThread( dwExitCode, TRUE );

}else{
for(int i=0;i<8;i++){
Animation2(i);
::SendMessage(mThreadInfo.pWnd1->m_hWnd,WM_ANIMATION_MESSAGE,
(WPARAM)(&array_animation),mThreadInfo.flag_list_animation);
Sleep(200);
}
}
}
是要在外部判断?在button相应事件中判断?
感觉越改越乱了!
AfxEndThread()这个退出只能在线程内部调用,在外部判断如何关闭线程呢?用这个函数TerminateThread?好像都不推荐用这个~
还望大神指点一二!
展开
 我来答
bhtzu
2015-04-09 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4027万
展开全部
首先说,WM_ANIMATION_MESSAGE,这样在工作者线程中发送界面消息是有问题的。这个消息同样被发送到主窗口的消息环中,和按钮响应消息进行排队,逻辑上不合理。几次你的提问,一直没有完整的需求框架描述,这样有点乱。涉及界面重绘显示的线程,通常采用UI线程,不过这个相对复杂了不少。

在线程内部结束是正确的方法,外部终止工作者线程并不合理,可能造成内存泄露或资源耗尽。从上面代码看不到太多信息,除了发现SendMessage操作了主界面,就是你for内部又加了一个for,这样中断也不会立刻发生,延时将近或超过2秒。还有就是WAIT_TIMEOUT的逻辑应该是用反了。

没有理解线程的编程思想,生硬的做代码确实会很乱。线程的东西,从逻辑和框架上都有不同,因为不清楚你的总体设计和逻辑,猜不出太多东西,帮不到太多。
追问
是的,tab control 中的对话框触发事件 发送消息(一个数组)给主界面,主界面显示这个数组,并更新对话框、串口发送数组数据!

用UI线程更新主界面,不知道如何进行!
不知道有没有空,可以将源码发给你,太菜了,如果可以能留个QQ
追答

通过这几次的讨论,大概了解了一些项目需求和你的熟练度,给你一组建议吧:

  1. UI界面线程先别弄了,估计这个你现在会更晕,先强化工作者线程的熟悉吧,这个先做精。

  2. 不清楚你界面显示的具体过程,但串口发送数据完全可以做一个工作者线程独立完成,这样串口通讯能够保持畅通,并且和主界面不冲突。MFC串口线程的例子非常多,这个有足够的参考和示例代码。

  3. 不清楚你的“显示数组”和“ANIMATION”有什么关系,是如何实现的。不过通常来讲,这样的显示在不是十分复杂的情况下,可以使用定时器实现(避免使用界面线程),将显示过程拆分到最小单元(不要用sleep),按钮中SetTimer启动定时器(并标记已经启动),在OnTimer里面实现最小单元绘制(进度控制变量为类成员)或【控制变量改变+触发区域重画】,这样所谓的“再次点击按钮重新开始”就非常容易了,只是在发现已启动定时器标记时,将控制变量初始化即可。

3中的方法,只要不是非常复杂的图形绘制,是没有问题的,需要注意的是,sleep这个方法,与win编程的消息机制是冲突的,不应该出现在非子线程的任何地方,这是你需要优化的主要东西。

来自:求助得到的回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式