定时读数据,这个听起来很简单,
有很多选择可以作。
但下面这种情况呢.
定时执行一段函数。这个函数是网络访问的,通常很快会跑完,但此时网络异常了,这个函数会很久才返回
如果你是简单的使用WM_TIMER的话,你就惨了。整个界面不动了。
这里想到了把这段放到线程里面去做。
但有个性能问题.
线程内部是循环的呢,还是执行完就退出,WM_TIMER到又创建线程呢.
我想应该前者好些,因为创建线程,系统需要开销.如果wm_timer 频率有点高,不停的创建线程,这…………
所以我想到了用线程内部循环.
类似代码while(???)
{
do something.
sleep(2000);
}这个时候又有新问题产生了
主程序关闭的时候,如何通知这个子线程正常退出呢.
有人说用全局变量。While(一个全局变量).但此时,线程正好在Sleep呢 …………
这段时间线程不会主动关闭噻这个问题有没有完美的解决方案,
我能开200分,有正确答案200分奉上,请效纳.
有很多选择可以作。
但下面这种情况呢.
定时执行一段函数。这个函数是网络访问的,通常很快会跑完,但此时网络异常了,这个函数会很久才返回
如果你是简单的使用WM_TIMER的话,你就惨了。整个界面不动了。
这里想到了把这段放到线程里面去做。
但有个性能问题.
线程内部是循环的呢,还是执行完就退出,WM_TIMER到又创建线程呢.
我想应该前者好些,因为创建线程,系统需要开销.如果wm_timer 频率有点高,不停的创建线程,这…………
所以我想到了用线程内部循环.
类似代码while(???)
{
do something.
sleep(2000);
}这个时候又有新问题产生了
主程序关闭的时候,如何通知这个子线程正常退出呢.
有人说用全局变量。While(一个全局变量).但此时,线程正好在Sleep呢 …………
这段时间线程不会主动关闭噻这个问题有没有完美的解决方案,
我能开200分,有正确答案200分奉上,请效纳.
1你可以有两个创建线程和结束线程的函数 如Start和Stop 利用一个内核对象event或者mutex使线程实例唯一
2或者总是创建线程 但线程函数中使用关键段禁止同时执行 不如1
3通知线程结束你可以用waitforsingleobject来代替Sleep,Stop时激发一个事件,是线程比较自然的返回
我不想定时创建线程
那么只创建一个线程,线程不能一直访问噻,是过一会再做事噻
做完事后,线程就不工作,使用sleep解决。但是刚好在sleep时,怎么关闭
同时等待一个定时器和主线程,设定为任意一个触发及返回
HANDLE hEvent[2] = {0};
hEvent[0] = ...; // 退出的EVENT
hEvent[1] = ...; // 做事的EVENT
BOOL bExitThread = FALSE;
while(!bExitThread)
{
DWORD dwRet = WaitForMultiObjects(hEvent, 2000);
if(WAIT_FAILED == dwRet)
{
// Error, Thread Exit;
break;
}
if(WAIT_TIMEOUT != dwRet)
{
switch(dwRet - WAIT_OBJECT_0)
{
case 0: // Exit
bExitThread = TRUE;
break;
case 1:
// Do something
break;
default:
ASSERT(FALSE);
break;
}
}
}
为什么不用sleep?和watiforsingleobject混蛋前者用于每个隔几秒钟 做一次, 后者用于检测是否退出线程。。
watiforsingleobject(,0); 立即返回,检测状态。sleep也不会耗cpu
但是如果需要复杂的控制,多种控制状态,我建议你在自己的线程中建立消息循环 MSG msg;
while(GetMessage(&msg, NULL, 0, 0))
{
if (msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}然后其他线程用PostThreadMessage来通知该线程。PS:只有计时是伪多线程的,时间一到还是以消息通知UI线程来处理的。很多人误解主要是测试数据工作量太小,看不出来。
后来用了线程,类似上面的工作;和你一样线程内while,但也有跑出线程的情况;没找到原因呢等专业高手
同等。
另外也可以使用start,stop,在stop中实现主动结束线程的操作。
没有更好的办法,
线程正常工作的时候,使用waitforsingleobject,
程序关闭的时候,等待线程结束后,才真正关闭.
只是WaitForMultiObjects这个函数,第二个参数需要的是handle.
有人可以介绍下用法吗?Cevent Event[];这个是class.
CEvent [] 到handle []