关于while循环不用sleep挂起还可以用什么方法

lylvtt 2012-03-29 07:41:23
比如一个循环
int n = 5;
while(n < 1)
{
n--;
}
这么一个循环我想每次都停留两秒;除了用sleep(2000)还可以用其他方式吗?
因为sleep让整个进程都停顿了,我不想这样
...全文
1338 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
一桶姜山 2012-07-05
  • 打赏
  • 举报
回复
用peekmessage做while循环会使进程占用cpu达到100%
用getmessage做while循环会使得程序在没有收到任何message时无法进入循环内部。

个人认为只有新开线程或用timer做才是最好的方法
null 2012-07-05
  • 打赏
  • 举报
回复
计时器
schlafenhamster 2012-06-17
  • 打赏
  • 举报
回复
BOOL CMyView::PeekAndPump()
{
static MSG msg;
while (::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if (!AfxGetApp()->PumpMessage())
{
::PostQuitMessage(0);
return FALSE;
}
}
return TRUE;

}

Andox 2012-06-17
  • 打赏
  • 举报
回复
WaitForSingleObject这类函数
ok1234567 2012-05-25
  • 打赏
  • 举报
回复
WaitForSingleObject
WaitForSingleObjectEx
xuqing19830921 2012-05-25
  • 打赏
  • 举报
回复
把循环放到一个线程里,使用信号量或者事件或者消息之类的进行控制
搬砖的奶霸 2012-05-17
  • 打赏
  • 举报
回复
补充 Sleep() 是 阻塞的 用了以后 整个线程都会阻塞;

用我的方法 系统会会运行的 你多学习下 mfc的消息机制 呵呵
搬砖的奶霸 2012-05-17
  • 打赏
  • 举报
回复
当然可以了 !
太简单了wait(2000);

void Wait()
{
MSG msg;
if( ::PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) )
{
::GetMessage(&msg, NULL, 0, 0 );
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
void Wait(LONG ms)
{
DWORD lT_old = GetTickCount();
DWORD lT = lT_old;
do
{
Wait();
lT = GetTickCount();
} while(lT - lT_old < (DWORD)ms);
}
w20120125 2012-05-17
  • 打赏
  • 举报
回复
哪个老师教你的,用Sleep整个进程都挂起来了?
breezes2008 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

SetWaitableTimer
MsgWaitForMultipleObjectsEx
[/Quote]
MsgWaitForMultipleObjectsEx 正解!
「已注销」 2012-05-12
  • 打赏
  • 举报
回复
// 不新开线程,不离开当下函数,就可以解决问题

DWORD time_begin;
MSG msg;

time_begin = GetTickCount();
SetTimer(0, 0, 20, 0);

while(GetMessage(&msg, 0, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);

if(GetTickCount() - time_begin > 10*1000)
break;
}

KillTimer(0, 0);

lijianli9 2012-05-10
  • 打赏
  • 举报
回复
工作线程,界面线程能理解好,这个问题基本就解决了。
Lactoferrin 2012-05-10
  • 打赏
  • 举报
回复
SetWaitableTimer
MsgWaitForMultipleObjectsEx
longteng 2012-05-07
  • 打赏
  • 举报
回复
同意9楼的说法,使用单独的线程(新线程)执行循环操作, 如果需要与主进程进行交换,就用委托及事件处理即可
cracker234 2012-04-22
  • 打赏
  • 举报
回复
while入口条件改为时间判断就好了,判断是不是过去2秒了
tzxx 2012-04-21
  • 打赏
  • 举报
回复
不用线程的话,定时器应该也基本满足了
newseacher 2012-04-21
  • 打赏
  • 举报
回复
waitforsingleobject ?
窗户纸 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
比如一个循环
int n = 5;
while(n < 1)
{
n--;
}
这么一个循环我想每次都停留两秒;除了用sleep(2000)还可以用其他方式吗?
因为sleep让整个进程都停顿了,我不想这样
[/Quote]
从你的描述看,貌似问题是主进程停顿,而不是用不用sleep(). 如果不想使主进程停顿,且进行每两秒一次的循环(操作A),那操作A应该放到后台执行,即使用单独的线程执行操作A, 如果需要与主进程进行交换,就用委托及事件处理即可, 另外,你的马甲好多呦
gg606 2012-03-30
  • 打赏
  • 举报
回复
是不是可以开个线程,把循环放在线程里,还是用sleep(2000)
向立天 2012-03-30
  • 打赏
  • 举报
回复
sleep是最好的方法了
为什么不用
加载更多回复(7)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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