SetTimer使用的问题

waguju 2010-06-03 04:23:54
OnButton()
{
SetTimer(1,1000,NULL);
func(...); //此函数可能会处理10几秒才返回
KillTimer(1);
}

OnTimer()
{
m_StatusBar->SetText(...);
}


这个为什么要等到func()函数处理返回才显示StatusBar上面的内容?
我的理解应该是调用SetTimer()函数之后应该就开始开始发WM_TIMER消息了,
状态栏应该在func()函数处理(10几秒)过程中每妙刷新显示了。请大牛们帮小弟解释一下,谢谢!

备注:我的目的就是让状态栏上动态显示func()函数处理所消耗的时间。
...全文
253 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingmen328 2010-06-05
  • 打赏
  • 举报
回复
不过可不可以将SetTimeThread 这个线程只设成一个settimer?
qingmen328 2010-06-05
  • 打赏
  • 举报
回复
同意楼上~~
magic7004 2010-06-04
  • 打赏
  • 举报
回复
楼主的OnButton和OnTimer是同一个线程的,确实OnButton里SetTimer以后Timer就开始工作了,但是楼主的线程只有执行完func后才能够处理WM_TIMER消息,也就是说func函数执行的10几秒里,楼主的程序是没有响应的状态,因为UI线程忙着执行func了,所以不能响应其他消息
xiongweilai 2010-06-04
  • 打赏
  • 举报
回复
定时器的回调函数是主线程的一部分,如果你要实现同步操作还是用线程和内核对象处理吧....
jackfeige 2010-06-04
  • 打赏
  • 举报
回复
func函数放线程里面执行就OK了
Eleven 2010-06-04
  • 打赏
  • 举报
回复
这种在主线程中有Sleep操作都放在子线程里去做。。。
奈落之夜宵 2010-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 soswaidao 的回复:]

SetTimer()函数之后, m_StatusBar->SetText(...)每10几秒执行一次,与func()函数无关
[/Quote]

顶这个,,当func执行完之后,才会去处理WM_TIMER消息
HJun_www 2010-06-04
  • 打赏
  • 举报
回复
2楼正解 ~ 学习~
gwq85387566 2010-06-04
  • 打赏
  • 举报
回复
bool g_bSet = true;
CString g_StrShow = L"";
UINT __cdecl SetTimeThread( LPVOID pParam )
{
DWORD dwTimeBegin = 0;
DWORD dwTimeNow = 0;
while(g_bSet)
{
if (dwTimeBegin == 0)
{
dwTimeBegin = GetTickCount();
}
dwTimeNow = GetTickCount();
if (dwTimeNow - dwTimeBegin >= 200)//用这个方法比较精确
{
CStatic* pStatic = (CStatic*)pParam;
if (pStatic == NULL)
{
return -1;
}
pStatic->SetWindowText(g_StrShow);
dwTimeBegin = 0;
}
Sleep(5);//不空跑
}
return 0;
}

UINT __cdecl DoWorkThread( LPVOID pParam )
{
for (int i=0; i<100; i++)
{
g_StrShow.Format(L"Show = %d", i);
Sleep(1000);
}
return 0;
}

void CTestDlg::OnBnClickedShow()//按钮响应函数
{
// TODO: Add your control notification handler code here
AfxBeginThread(SetTimeThread, (LPVOID)&m_StaticShow, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
AfxBeginThread(DoWorkThread, (LPVOID)&m_StaticShow, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
}

PS:你可以开两个线程,只要不阻塞主线程,一个工作,一个用来显示,测试通过
klkvc386 2010-06-04
  • 打赏
  • 举报
回复
UP..........
yunyun1886358 2010-06-04
  • 打赏
  • 举报
回复
从现象来看,func和ontimer处于同一个线程,不能并行。
lzjdlsl 2010-06-04
  • 打赏
  • 举报
回复
2楼完全正确。我以前也在一个多线程中用定时器不对。现在才知道原因。学习了
Zimmerk 2010-06-03
  • 打赏
  • 举报
回复
用线程来执行func函数,就可以实时更新时间了
vann1982 2010-06-03
  • 打赏
  • 举报
回复
线程+定时可行
ghvvvv 2010-06-03
  • 打赏
  • 举报
回复
长一个知识
lanneret1234 2010-06-03
  • 打赏
  • 举报
回复
定时器是同步的!!用线程吧
wuweiyin 2010-06-03
  • 打赏
  • 举报
回复
我觉得可以建一个线程处理func()函数,此函数开始时给计时器一个信号开始计时并将计时显示在状态栏中动态更新,当func结束时再给计时器一个信号,终止计时器。
wltg2001 2010-06-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 waguju 的回复:]
现在我想知道的是我要求的动态显示状态栏的功能应该如何实现的,有没有哪位提示一下,万分感谢!
[/Quote]
你如果想让状态栏动态显示func执行的时间,恐怕不容易,一个想法是,你开一个线程,在线程中等待一个内核对象,同时设为一个全局的BOOL变量,比如BOOL Is=TRUE;
在线程中用while(Is)在这个循环中不停地更新状态栏。
在你的func函数中给内核对象信号,让线程启动,在func结束时设Is=FALSE,让线程退出。
m_nAdrs 2010-06-03
  • 打赏
  • 举报
回复
长知识来了
jyh_baoding 2010-06-03
  • 打赏
  • 举报
回复
定时器是消息驱动的,必须等当前的按钮点击消息处理函数返回后,才有机会调用
加载更多回复(12)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧