首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个有关问题难住了小弟我们的技术总监,求大家帮忙分析:为什么创建2个定时器,第一个创建生效,第二个没生效

2012-04-13 
一个问题难住了我们的技术总监,求大家帮忙分析:为什么创建2个定时器,第一个创建生效,第二个没生效!注意下

一个问题难住了我们的技术总监,求大家帮忙分析:为什么创建2个定时器,第一个创建生效,第二个没生效!
注意下面我是用win32原生的方式创建定时器,不是用封装过的MFC
首先,我在主线程里创建个线程:
HANDLE dwThreadId;
   
  HANDLE Thread = CreateThread( NULL, // default security attributes
  0, // use default stack size  
  ThreadProc, // thread function  
  NULL, // argument to thread function  
  0, // use default creation flags  
  &dwThreadId); // returns the thread identifier  
  if (Thread == NULL)  
  {
  return OS_ERROR;
  }

在线程里设置定时器并启用消息泵:

DWORD WINAPI ThreadProc( LPVOID lpParam )
{
MSG msg;
g_uwTimeerId = SetTimer(NULL,1,1,TimeProc);

while(GetMessage(&msg,NULL,0,0))  
{  
if(msg.message==WM_TIMER)  
{  
DispatchMessage(&msg);  
}  
}  

return OS_SUCCESS;
}

这一次定时器启动成功 TimeProc 确实在循环调用!

关键的问题来了,我想再启动一个定时器,注意这次我是想在主线程里再SetTimer 一次!!
看我的实现:
主线程里:g_HwiTimeerId = SetTimer(NULL,1,1,SecondTimeProc);
但是这一次定时器好像没能启动成功,SecondTimeProc 压根没进去!!!
为什么SecondTimeProc 压根没进去呢?这个是问题所在!简单调试了下,GetMessage貌似没得到!为什么呢?

谢谢!! 


[解决办法]
两个timerID一样的, 鉴定完毕..
[解决办法]
哎,这也能称技术总监啊。。。
[解决办法]

探讨

引用:
两个timerID一样的, 鉴定完毕..

呵呵,能帮忙分析下逻辑有什么问题吗

[解决办法]
SecondTimeProc
TimeProc
有必要两个回调函数?
直接一个,分不同ID就可以处理了
[解决办法]
你的技术总监不懂SetTimer函数参数的意义?
[解决办法]
CTO - Company Timer Officer
[解决办法]
1、主线程里:g_HwiTimeerId = SetTimer(NULL,1,1,SecondTimeProc);
这个 SetTimer 返回成功了吗?

2、主线程里的SetTimer是在子线程的SetTimer之前还是之后做的?

3、试下先在主线程 SetTimer,再创建子线程,看看现象是什么?


[解决办法]
第一个参数为NULL时 第二个和第三个参数无效啊 msdn上白纸黑字写着啊
[解决办法]
错了 是第二个参数忽略
[解决办法]
你创建窗口时不时有个hwnd吗?SetTimer(hwnd,1,1,TimeProc)。如果你把hwnd设置成NULL,则SetTimer()第二个参数会被忽略,你再改ID就不管用了。貌似是这样
[解决办法]
探讨

你创建窗口时不时有个hwnd吗?SetTimer(hwnd,1,1,TimeProc)。如果你把hwnd设置成NULL,则SetTimer()第二个参数会被忽略,你再改ID就不管用了。貌似是这样

[解决办法]
这是不同线程之间发送消息
你的ThreadProc里面的的消息循环自然可以获取本线程里的消息,
不同线程之间发送消息需要sendmessage
参考Windows核心编程线程界面那一块

[解决办法]
如果已经创建一个timer,但是没有删除,在一次创建同样的timer会失败。
代码改为:

C/C++ code
if (0!=g_uwTimeerId){KillTimer(g_uwTimeerId);}g_uwTimeerId = SetTimer(NULL,1,1,TimeProc);
[解决办法]
真不敢相信我居然不是技术总监。
[解决办法]
NukeNabbe 你用过没
------解决方案--------------------


标题党,果然nb,很快就让别人帮忙定位到问题了。
[解决办法]
标题是你们公司的技术总监让你这么写的吧,真牛B。。。
[解决办法]
反正一条,用NULL作为第一个参数,启动第一个之后,在创建,是要kill掉第一个的吧。第二个才生效。
这个用定时器刷新界面用的相当多哦。
估计是你自己也的东西吧。
[解决办法]
也许你们技术总监不做windows下的开发

热点排行