暂停函数除了使用Sleep()之外还有其它函数没?

txdy077345 2014-03-01 11:44:59
是这样的,我在写一个程序,需要不停的暂停执行一下,虽然使用Sleep()函数简单,但是如果使用Sleep()函数,那么程序在暂停执行时不能响应我设置的快捷键,你们觉得如何解决这个问题?
注:越简单越好。
...全文
339 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
txdy077345 2014-03-05
  • 打赏
  • 举报
回复
引用 11 楼 u013769334 的回复:
这我最近有研究到,想出了三种方法 方法一:利用线程方法,不过我对线程不熟,不知道如何提前结束正在 Sleep() 的线程
struct Sleep1_struct
{
	HANDLE hEvent;
	int nSleepTime;
};

UINT Sleep1Thread(LPVOID pWaitTime)
{
	Sleep1_struct * sleep = (Sleep1_struct *)pWaitTime;
	Sleep(sleep->nSleepTime);
	SetEvent(sleep->hEvent);	//休眠结束后, 设为有讯号
	return 0;
}

void CEventImporterUIDlg::Sleep1(unsigned long nWaitTime)
{
	Sleep1_struct sleep;
	sleep.nSleepTime   = nWaitTime;
	sleep.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	CWinThread * pThread = AfxBeginThread(Sleep1Thread, &sleep);	//建立 Thread
	
	//WaitForSingleObject() 有讯号状态下, 会返回 WAIT_OBJECT_0, 无讯号则返回 WAIT_TIMEOUT
	while(WaitForSingleObject(sleep.hEvent, INFINITE) == WAIT_TIMEOUT)
	{
		//判断 UI 上是否有讯息需要处理
		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	CloseHandle(sleep.hEvent);
}
方法二:利用循环一次休眠 100 毫秒,这方法也蛮笨的
void CEventImporterUIDlg::Sleep2(unsigned long nWaitTime)
{
	while(1)
	{
		//判断 UI 上是否有讯息需要处理
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
		{					
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

		//若 sleeptime 不足 100 豪秒, 则休眠 nWaitTime 后跳出
		if(nWaitTime<100)
		{
			if(nWaitTime!=0)
				Sleep(nWaitTime);
			break;
		}

		//每次休眠 100 毫秒
		Sleep(100);
		nWaitTime -= 100;
	}
}
方法三:利用程式暂用 CPU 时间,不过一直循环好像很浪费 CPU 资源
void CEventImporterUIDlg::Sleep3(unsigned long nWaitTime)
{
    unsigned long nStart = clock();	//clock() 会回传程式执行后占用的 CPU 时间, 精确度到毫秒
    unsigned long nEnd = nStart;
    do
	{
		if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
		{
			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
        nEnd = clock();
    } while( ( nEnd - nStart )  <=  nWaitTime );
}
你这种方法很好,我也有看到,我对多线程也不是很了解,我尝试采用第二种,第三种太占CPU。
leson0628 2014-03-04
  • 打赏
  • 举报
回复
这我最近有研究到,想出了三种方法 方法一:利用线程方法,不过我对线程不熟,不知道如何提前结束正在 Sleep() 的线程
struct Sleep1_struct
{
	HANDLE hEvent;
	int nSleepTime;
};

UINT Sleep1Thread(LPVOID pWaitTime)
{
	Sleep1_struct * sleep = (Sleep1_struct *)pWaitTime;
	Sleep(sleep->nSleepTime);
	SetEvent(sleep->hEvent);	//休眠结束后, 设为有讯号
	return 0;
}

void CEventImporterUIDlg::Sleep1(unsigned long nWaitTime)
{
	Sleep1_struct sleep;
	sleep.nSleepTime   = nWaitTime;
	sleep.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	CWinThread * pThread = AfxBeginThread(Sleep1Thread, &sleep);	//建立 Thread
	
	//WaitForSingleObject() 有讯号状态下, 会返回 WAIT_OBJECT_0, 无讯号则返回 WAIT_TIMEOUT
	while(WaitForSingleObject(sleep.hEvent, INFINITE) == WAIT_TIMEOUT)
	{
		//判断 UI 上是否有讯息需要处理
		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
		{
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}
	CloseHandle(sleep.hEvent);
}
方法二:利用循环一次休眠 100 毫秒,这方法也蛮笨的
void CEventImporterUIDlg::Sleep2(unsigned long nWaitTime)
{
	while(1)
	{
		//判断 UI 上是否有讯息需要处理
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
		{					
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}

		//若 sleeptime 不足 100 豪秒, 则休眠 nWaitTime 后跳出
		if(nWaitTime<100)
		{
			if(nWaitTime!=0)
				Sleep(nWaitTime);
			break;
		}

		//每次休眠 100 毫秒
		Sleep(100);
		nWaitTime -= 100;
	}
}
方法三:利用程式暂用 CPU 时间,不过一直循环好像很浪费 CPU 资源
void CEventImporterUIDlg::Sleep3(unsigned long nWaitTime)
{
    unsigned long nStart = clock();	//clock() 会回传程式执行后占用的 CPU 时间, 精确度到毫秒
    unsigned long nEnd = nStart;
    do
	{
		if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
		{
			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
        nEnd = clock();
    } while( ( nEnd - nStart )  <=  nWaitTime );
}
Eleven 2014-03-03
  • 打赏
  • 举报
回复
主线程中就不要Sleep了
thinp 2014-03-03
  • 打赏
  • 举报
回复
使用定时器是个比较简单的做法,线程不要堵死,Sleep会堵死线程
shen_wei 2014-03-03
  • 打赏
  • 举报
回复
你可以用定时器。。sleep这个最好不要使用。。
encoderlee 版主 2014-03-02
  • 打赏
  • 举报
回复
你是在主线程中使用Sleep()? 如果只是想隔一段时间再执行其它代码的话,可以用计时器,SetTimer()
zgl7903 2014-03-02
  • 打赏
  • 举报
回复
Be careful when using Sleep and code that directly or indirectly creates windows. If a thread creates any windows, it must process messages. Message broadcasts are sent to all windows in the system. If you have a thread that uses Sleep with infinite delay, the system will deadlock. Two examples of code that indirectly creates windows are DDE and COM CoInitialize. Therefore, if you have a thread that creates windows, use MsgWaitForMultipleObjects or MsgWaitForMultipleObjectsEx, rather than Sleep.
rxguoblp 2014-03-02
  • 打赏
  • 举报
回复
如果是在主线程中,你频繁暂停话,程序设计有问题;如果在子线程中,使用sleep()就行了。
真相重于对错 2014-03-02
  • 打赏
  • 举报
回复
waitforsingleobject
schlafenhamster 2014-03-02
  • 打赏
  • 举报
回复
MSG msg; while(PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE) { Sleep(100) }
txdy077345 2014-03-02
  • 打赏
  • 举报
回复
这个可以有,只是结构估计要做一些变化了,偿试一下,谢谢!
txdy077345 2014-03-02
  • 打赏
  • 举报
回复
你说的创建子线程和使用其它函数,然后用主线程关闭子线程?

16,472

社区成员

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

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

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