VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1112|回复: 5

关于线程操作

[复制链接]
71_avatar_middle
最佳答案
0 
在线会员 发表于 2016-2-7 08:18:17 | 显示全部楼层 |阅读模式
3驿站币
各位大侠,请教个问题:
我建立一个单文档程序,想在状态栏显示用户登陆时间,由于系统运行代码较多,OnTimer函数不响应,于是我使用了线程,如下为线程执行程序,在OnTimer中执行pThread=AfxBeginThread(ThreadFunc,NULL);
UINT ThreadFunc(LPVOID lpParam)
{
        CString s;
        CurrentTime=CTime::GetCurrentTime();
        span=CurrentTime-DengLuTime;
        s.Format("已登录%02dh%02dm%02ds",span.GetHours(),span.GetMinutes(),span.GetSeconds());
        m_MYStatusBar.SetPaneText(4,s);
        return 0;
}
其中pThread、CurrentTime、span、DengLuTime、m_MYStatusBar定义为全局变量,m_MYStatusBar在Create函数中已经定义,编译程序没问题,运行程序时当运行到OnTimer是程序出错强制退出。

这个问题实在让我费解,请大侠指点。





上一篇:qq登陆验证码
下一篇:求大神帮忙
74_avatar_middle
最佳答案
0 
在线会员 发表于 2016-2-9 19:17:28 来自手机 | 显示全部楼层
thread不应该直接操作ui而是post/send message给 main  thread 否则可能产生未定义行为 其次 你至少把出现什么错误讲出來 让孤猜吗?
71_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2016-2-10 11:05:52 | 显示全部楼层
zuiwuchang 发表于 2016-2-9 19:17
thread不应该直接操作ui而是post/send message给 main  thread 否则可能产生未定义行为 其次 你至少把出现 ...

现在是在DUBGE模式下运行会出现,REALEASE下运行正常,我这插不了图片
关于线程操作
83_avatar_middle
最佳答案
0 
在线会员 发表于 2016-2-15 01:09:47 | 显示全部楼层
如果是在DEBUG下出现毛病而在REALEASE正常,通常的原因是越界。就那么几句,可能是在FORMAT里没处理好?
反正如果出现这个问题,那一定要引起足够的重视,否则后面调试起来能要人命。
53_avatar_middle
最佳答案
0 
在线会员 发表于 2016-2-29 21:00:34 | 显示全部楼层
本帖最后由 xieglt 于 2016-2-29 21:04 编辑

猜想一下你的错误发生在哪,不保证对。
你的 SetTimer() 语句 一定是放在 m_MYStatusBar 的 create 语句之前的。
这样,你的程序就无法保证启动线程并执行时,m_MYStatusBar 一定生成了。
它有可能已经生成了,也有可能没有生成。
所以,把SetTimer 放到 m_MYStatusBar 的 create 语句之后,
把 KillTimer 放到它的destroy 之前。

另外为什么要在OnTimer里面启动线程呢?
OnTimer每执行一次,你就启动一个线程,虽然,你的线程最后都自动退出了,但我觉得这并不是一个好的方式。
建议把线程写成死循环。
代码如下

定义全局变量 HANDLE  exitEvent = NULL;

exitEvent = ::CreateEvent(NULL,FALSE,FALSE,NULL);

线程函数:
UINT ThreadFunc(LPVOID lpParam)
{
        CString s;
        for(;;)
       {
                if(WaitForSingleObject(exitEvent,1000) != WAIT_TIMEOUT)
                {
                         ResetEvent(exitEvent);
                         break;
                }
                CurrentTime=CTime::GetCurrentTime();
                span=CurrentTime-DengLuTime;
                s.Format("已登录%02dh%02dm%02ds",span.GetHours(),span.GetMinutes(),span.GetSeconds());
                m_MYStatusBar.SetPaneText(4,s);
        }
        return 0;
}

不要在OnTimer里启动线程,
把  pThread=AfxBeginThread(ThreadFunc,NULL);
这一句加到m_MYStatusBar 的 create 之后

退出线程代码:
  SetEvent(exitEvent);
  if(WaitForSingleObject(pThread->m_hThread,1000) == WAIT_TIMEOUT)
{
        //超时则强制关闭线程
        TerminateThread(pThread->m_hThread,-1);
}


最后,程序退出时记得释放资源
CloseHandle(exitEvent);
71_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2016-3-3 14:41:31 | 显示全部楼层
xieglt 发表于 2016-2-29 21:00
猜想一下你的错误发生在哪,不保证对。
你的 SetTimer() 语句 一定是放在 m_MYStatusBar 的 create 语句之 ...

非常感谢,解释的这么清楚,万分感激!
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-21 18:17

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表