主线程有什么好的延时方法?

时间:2022-06-13 00:24:05
开多线程,用全局变量来记录线程数量,在主线程中用 while(true)  来判断,如果用sleep延时的话,有时候会出现未响应的情况,有没有更好一点的方法?

17 个解决方案

#1


为什么要在主线程当中??你这样做必然的啊
开个线程,然后通过这个线程替代你现在让主线程干的事

#2


骚逮撕奶,另问还有别的方法吗?

#3


另外,现在网络盛传的sleep 占用大量CPU是否为真,小菜同问

#4


sleep会放出CPU,不会导致 占用大量CPU
不想用sleep的话,可以用WaitForSingleObject(event,100)来等待一个未激活的事件

#5


主线程一般不建议Sleep,主要会造成消息没能及时处理,导致界面无响应

#6


线程退出时候发消息给主线程,不需要主线程进行监视

#7


引用 5 楼  的回复:
主线程一般不建议Sleep,主要会造成消息没能及时处理,导致界面无响应


那有什么好方法呢?

#8


引用 6 楼  的回复:
线程退出时候发消息给主线程,不需要主线程进行监视


能给出稍微具体一点的步骤吗

#9


用一个主线程就可以干好这些事情,但是需要统筹管理工作时间,请注意下面代码里的注释:

start:
    while(PeekMessage(msg, NULL, 0, 0, PM_REMOVE)){ // 攫取出消息
        if(msg->message == WM_QUIT)  // 如果是quit消息,则结束操作
             goto end;

        DispatchMessage(msg);  // 分发攫取到的消息
    }
    // 如果程序运行到这里,说明消息队列里的消息都被分发,现在处于空闲(Idle)状态。
    //  现在可以做你的工作,但是,不要长时间工作,必须将工作分成小片小片的,每次做一片。
    do_your_job_piece();
    
    // 下面要getmessage,阻塞等待消息,如果没有这个函数,CPU占用率会达到100%
    if(!GetMessage(msg, NULL, 0, 0))
         goto end;

    DispatchMessage(msg);  // 分发

    goto start;  // 重复这个过程

end: 结束

代码是我随手写的,存在问题,比如,处理键盘(浏览键)消息,但大致就是这个意思。

#10


引用 9 楼  的回复:
用一个主线程就可以干好这些事情,但是需要统筹管理工作时间,请注意下面代码里的注释:

start:
  while(PeekMessage(msg, NULL, 0, 0, PM_REMOVE)){ // 攫取出消息
  if(msg->message == WM_QUIT) // 如果是quit消息,则结束操作
  goto end;

  DispatchMessage(msg)……


谢谢分享,另求更多方法

#11


尽量不要在主线程处理,简单一点可以标记个信号量,当无信号时不处理,并设定个定时器重置信号量。

#12


尽量不要在主线程处理,简单一点可以标记个信号量,当无信号时不处理,并设定个定时器重置信号量。 
 

#13


尽量不要在主线程处理。 
 

#14


主线程就不应该延时
什么和延时有关的方法都不该用

#15


引用 5 楼  的回复:
主线程一般不建议Sleep,主要会造成消息没能及时处理,导致界面无响应


+++

#16


谢谢各位,小弟又开了一个线程延时等待判断,就解决这个问题了,结贴

#17


不要在 CXXXDlg 的事件处理函数中 进行工作量大、占用时间长的任务。必然“未响应”。
可以放在其他线程里完成。

#1


为什么要在主线程当中??你这样做必然的啊
开个线程,然后通过这个线程替代你现在让主线程干的事

#2


骚逮撕奶,另问还有别的方法吗?

#3


另外,现在网络盛传的sleep 占用大量CPU是否为真,小菜同问

#4


sleep会放出CPU,不会导致 占用大量CPU
不想用sleep的话,可以用WaitForSingleObject(event,100)来等待一个未激活的事件

#5


主线程一般不建议Sleep,主要会造成消息没能及时处理,导致界面无响应

#6


线程退出时候发消息给主线程,不需要主线程进行监视

#7


引用 5 楼  的回复:
主线程一般不建议Sleep,主要会造成消息没能及时处理,导致界面无响应


那有什么好方法呢?

#8


引用 6 楼  的回复:
线程退出时候发消息给主线程,不需要主线程进行监视


能给出稍微具体一点的步骤吗

#9


用一个主线程就可以干好这些事情,但是需要统筹管理工作时间,请注意下面代码里的注释:

start:
    while(PeekMessage(msg, NULL, 0, 0, PM_REMOVE)){ // 攫取出消息
        if(msg->message == WM_QUIT)  // 如果是quit消息,则结束操作
             goto end;

        DispatchMessage(msg);  // 分发攫取到的消息
    }
    // 如果程序运行到这里,说明消息队列里的消息都被分发,现在处于空闲(Idle)状态。
    //  现在可以做你的工作,但是,不要长时间工作,必须将工作分成小片小片的,每次做一片。
    do_your_job_piece();
    
    // 下面要getmessage,阻塞等待消息,如果没有这个函数,CPU占用率会达到100%
    if(!GetMessage(msg, NULL, 0, 0))
         goto end;

    DispatchMessage(msg);  // 分发

    goto start;  // 重复这个过程

end: 结束

代码是我随手写的,存在问题,比如,处理键盘(浏览键)消息,但大致就是这个意思。

#10


引用 9 楼  的回复:
用一个主线程就可以干好这些事情,但是需要统筹管理工作时间,请注意下面代码里的注释:

start:
  while(PeekMessage(msg, NULL, 0, 0, PM_REMOVE)){ // 攫取出消息
  if(msg->message == WM_QUIT) // 如果是quit消息,则结束操作
  goto end;

  DispatchMessage(msg)……


谢谢分享,另求更多方法

#11


尽量不要在主线程处理,简单一点可以标记个信号量,当无信号时不处理,并设定个定时器重置信号量。

#12


尽量不要在主线程处理,简单一点可以标记个信号量,当无信号时不处理,并设定个定时器重置信号量。 
 

#13


尽量不要在主线程处理。 
 

#14


主线程就不应该延时
什么和延时有关的方法都不该用

#15


引用 5 楼  的回复:
主线程一般不建议Sleep,主要会造成消息没能及时处理,导致界面无响应


+++

#16


谢谢各位,小弟又开了一个线程延时等待判断,就解决这个问题了,结贴

#17


不要在 CXXXDlg 的事件处理函数中 进行工作量大、占用时间长的任务。必然“未响应”。
可以放在其他线程里完成。