如何写个函数,带有超时功能! 我们用到多很多函数都可以设置超时,但我现在就是想弄明白,象这样的函数到底该怎么写! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 超时的函数设计要牵涉到WINDOWS内核资源,例如事件函数:::WaitForSingleObject(m_hEventReadBuff,INFINITE);我还没见过谁写出来的,同感!! 这个我知道!但是我想自几写个带超时的函数!例如,我要写个函数用遍历硬盘寻找某个文件,但是还要设置个超时,例如超过60秒就放弃,RETURN FALSE; 我倒是有一个思路:超时的函数TimeOutFunction()和一个线程DoWhatYouDoThread(LPVID nParam)来实现:HANDLE m_hEventTimeOut = CreateEvent(NULL,FALSE,FALSE,NULL);//开始信号为无int TimeOutFunction(){ //启动一个线程做你想要做的事 AfxBeginThread(DoWhatYouDoThread , (LPVOID)nParam); if(WaitForSingleObject(m_hEventTimeOut ,nTime)!=WAIT_OBJECT_0) {//超时等返回 return -1; } else {//正常返回 return 1; }}UINT DoWhatYouDoThread(LPVID nParam){ if(做完了....) { //设置有信号表示TimeOutFunction()可以马上返回啦。 SetEvent(m_hEventTimeOut); } else { //继续做吧 } //如果没做完TimeOutFunction()也已经超时返回,那你看着办怎样处理本线程}成功了请客!! zxiaox(呆呆2002),非常感谢!这种方法我以前也用过,虽然她也可以起到超时的效果,但是这个函数还是不能用在主线程中,以为在主线程中一但WaitForSingleObject,主线程就处于等待状态,其他的消息响应就停止了,例如我本来是想对串口超作,写个超时函数来对串口通信,结果用了这个函数,在WaitForSingleObject之后,主线程就停止了其他的响应,包括串口的响应! 用MsgWaitForMultipleObjectsEx,可以在等待信号灯过程中进行消息循环,下面是<atlbase.h>中的某段代码,可供你参考:ATLINLINE ATLAPI_(BOOL) AtlWaitWithMessageLoop(HANDLE hEvent){ DWORD dwRet; MSG msg; while(1) { dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, INFINITE, QS_ALLINPUT); if (dwRet == WAIT_OBJECT_0) return TRUE; // The event was signaled if (dwRet != WAIT_OBJECT_0 + 1) break; // Something else happened // There is one or more window message available. Dispatch them while(PeekMessage(&msg,0,0,0,PM_NOREMOVE)) { // check for unicode window so we call the appropriate functions BOOL bUnicode = ::IsWindowUnicode(msg.hwnd); BOOL bRet; if (bUnicode) bRet = ::GetMessageW(&msg, NULL, 0, 0); else bRet = ::GetMessageA(&msg, NULL, 0, 0); if (bRet > 0) { ::TranslateMessage(&msg); if (bUnicode) ::DispatchMessageW(&msg); else ::DispatchMessageA(&msg); } if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0) return TRUE; // Event is now signaled. } } return FALSE;} 1.同意:arxing(阿行)的说法,这是一个可以解决主线程对其它事件的一个响应办法 。2.如果是对串口操作的话,我觉得应该分别开启两个CWinThread线程进行读写,然后通过::PostThreadMessage()对线程进行通讯和控制,建议在主线程避免有阻塞和耗时的函数调用。 MsgWaitForMultipleObjects()是个好的决绝方案。既不遗漏消息,又可以等待对象。 嗯,差不多该揭帖了!就用这个MsgWaitForMultipleObjects 线程中创建CListCtrl控件 急!!!! 谁有用Win32 API直接操作串口的例子? 如何设定对话框的系统菜单 如何察看所有windows message的值? 怎样获得本机器的IP地址和机器名称? 一个 LIST 控件分类数据的问题 ******** 最近工作挺闲的,想揽话干 ********* 我的FAQ为什么不能通过审核? MTS怎样才能在2000AdsServer上安装? 单文档程序怎么改变坐标系?急 微软的MSComm控件在开发软件到底有哪些问题,欢迎讨论。 window blind是怎么实现的?
例如,我要写个函数用遍历硬盘寻找某个文件,但是还要设置个超时,例如超过60秒就放弃,RETURN FALSE;
HANDLE m_hEventTimeOut = CreateEvent(NULL,FALSE,FALSE,NULL);//开始信号为无int TimeOutFunction()
{
//启动一个线程做你想要做的事
AfxBeginThread(DoWhatYouDoThread , (LPVOID)nParam); if(WaitForSingleObject(m_hEventTimeOut ,nTime)!=WAIT_OBJECT_0)
{//超时等返回
return -1;
}
else
{//正常返回
return 1;
}}UINT DoWhatYouDoThread(LPVID nParam)
{
if(做完了....)
{
//设置有信号表示TimeOutFunction()可以马上返回啦。
SetEvent(m_hEventTimeOut);
}
else
{
//继续做吧
} //如果没做完TimeOutFunction()也已经超时返回,那你看着办怎样处理本线程}成功了请客!!
这种方法我以前也用过,虽然她也可以起到超时的效果,但是这个函数还是不能用在主线程中,以为在主线程中一但WaitForSingleObject,主线程就处于等待状态,其他的消息响应就停止了,例如我本来是想对串口超作,写个超时函数来对串口通信,结果用了这个函数,在WaitForSingleObject之后,主线程就停止了其他的响应,包括串口的响应!
ATLINLINE ATLAPI_(BOOL) AtlWaitWithMessageLoop(HANDLE hEvent)
{
DWORD dwRet;
MSG msg;
while(1)
{
dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, INFINITE, QS_ALLINPUT);
if (dwRet == WAIT_OBJECT_0)
return TRUE; // The event was signaled
if (dwRet != WAIT_OBJECT_0 + 1)
break; // Something else happened
// There is one or more window message available. Dispatch them
while(PeekMessage(&msg,0,0,0,PM_NOREMOVE))
{
// check for unicode window so we call the appropriate functions
BOOL bUnicode = ::IsWindowUnicode(msg.hwnd);
BOOL bRet;
if (bUnicode)
bRet = ::GetMessageW(&msg, NULL, 0, 0);
else
bRet = ::GetMessageA(&msg, NULL, 0, 0);
if (bRet > 0)
{
::TranslateMessage(&msg);
if (bUnicode)
::DispatchMessageW(&msg);
else
::DispatchMessageA(&msg);
}
if (WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
return TRUE; // Event is now signaled.
}
}
return FALSE;
}
既不遗漏消息,又可以等待对象。
就用这个MsgWaitForMultipleObjects