解决sleep延时阻塞程序主线程,造成程序未响应问题方案

来源:互联网 发布:1688进货淘宝卖怎么样 编辑:程序博客网 时间:2024/06/04 19:29

延时是以ms为单位,在计数时要加以注意

1,头文件

//Download by http://www.NewXing.com#ifndef _XSLEEP_H_#define _XSLEEP_H_void XSleep(int nWaitInMSecs);#endif // _XSLEEP_H_

2,源文件

#include <windows.h>// This structure is used internally by the XSleep function struct XSleep_Structure{    int duration;    HANDLE eventHandle;};//////////////////////////////////////////////////////////////////////// Function  : XSleepThread()// Purpose   : The thread which will sleep for the given duration// Returns   : DWORD WINAPI// Parameters:       //  1. pWaitTime -//////////////////////////////////////////////////////////////////////DWORD WINAPI XSleepThread(LPVOID pWaitTime){    XSleep_Structure *sleep = (XSleep_Structure *)pWaitTime;    Sleep(sleep->duration);    SetEvent(sleep->eventHandle);    return 0;}//////////////////////////////////////////////////////////////////////// Function  : XSleep()// Purpose   : To make the application sleep for the specified time//             duration.//             Duration the entire time duration XSleep sleeps, it//             keeps processing the message pump, to ensure that all//             messages are posted and that the calling thread does//             not appear to block all threads!// Returns   : none// Parameters:       //  1. nWaitInMSecs - Duration to sleep specified in miliseconds.//////////////////////////////////////////////////////////////////////void XSleep(int nWaitInMSecs){    XSleep_Structure sleep;    sleep.duration      = nWaitInMSecs;    sleep.eventHandle   = CreateEvent(NULL, TRUE, FALSE, NULL);    DWORD threadId;    CreateThread(NULL, 0, &XSleepThread, &sleep, 0, &threadId);    MSG msg;    while(::WaitForSingleObject(sleep.eventHandle, 0) == WAIT_TIMEOUT)    {        //get and dispatch messages        if(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))        {            ::TranslateMessage(&msg);            ::DispatchMessage(&msg);        }    }    CloseHandle(sleep.eventHandle);}
0 0
原创粉丝点击