线程执行时间控制

时间:2022-12-29 19:25:08
系统为wince,在主线程中使用cesetthreadquantum设置时间片为20ms,同时创建另一线程,由于在主线程中有一循环,想使主线程在执行完一次循环后停止下次循环,但不放弃时间片,直到20ms耗尽后切换到下一线程,哪位高人指点一下啊

14 个解决方案

#1


sleep掉?

#2


Wince里有GetThreadTimes 函数吗?

#3


sleep(0);

#4


1.为什么要20ms耗尽?是为了解决什么问题?
2.主线程循环
  {
     // 
     do{ 检测到某信号量退出, 干无聊事情浪费时间 }while(0);
  }
  内核代码里面改改,线程切换的时候,把某信号量置位。

#5


sleep会放弃时间片的。

#6


1.为什么要20ms耗尽?是为了解决什么问题?
2.主线程循环
  {
    //
    do{ 检测到某信号量退出, 干无聊事情浪费时间 }while(1);
  }
  内核代码里面改改,线程切换的时候,把某信号量置位。

#7


线程开始用 GetTickCount 函数得到个程序运行时间

线程结束 GetTickCount 得到个时间

2个时间相减

如果不够20ms sleep

但不知道这么做的精度够不够

#8


sleep 总归是不能用,得循环干垃圾活浪费掉时间片!
并且,内部计时得方式只是保证执行期长度,和线程得时间片本身不能等同处理。循环一次可能大于一个时间片。

#9


耗尽20ms是为了将时间均匀打散,这样数据显示不会闪烁,sleep会放弃时间片的啊

#10


在循环开始与结尾使用gettickcount计算时间,不够就循环,结束条件为时间到,这样应该可以,该内核太复杂了吧

#11


线程能不能使用完 整个时间片,不是你能决定的吧,是有内核调度决定的。而且这样做的目的是什么?

#12


放弃时间片怎么就导致数据显示闪烁了?多任务系统,没事情就应该放弃时间片,提高系统效率。
如果是为了数据显示不会闪烁。那应该显示那里去做处理,比如说使用内存DC双缓冲,合理使用裁减区等!


另外,如果要求你的程序每次循环之间都必须 >= 某时间的话,那gettickcount是可以考虑的。
exe_time = GetTickCount();
主线程循环
{
   while(GetTickCount() - exe_time<=20ms)
   {
      sleep(0);    // 这里就是立即放弃当前时间片,让其他任务处理。
      exe_time = GetTickCount();
   }
   // do your things
}

#13


上面的错了:

exe_time = GetTickCount();
主线程循环
{
  while(GetTickCount() - exe_time <=20ms)
      sleep(0);    // 这里就是立即放弃当前时间片,让其他任务处理。
  exe_time = GetTickCount();

  // do your things

#14


不需要Sleep,想把分线程的时间夺过来,提高主线程的优先级,这样分线程执行一段时间让主线程启动,把时间夺过来,不过要保护好数据,别没等显示,就被更新了。

#1


sleep掉?

#2


Wince里有GetThreadTimes 函数吗?

#3


sleep(0);

#4


1.为什么要20ms耗尽?是为了解决什么问题?
2.主线程循环
  {
     // 
     do{ 检测到某信号量退出, 干无聊事情浪费时间 }while(0);
  }
  内核代码里面改改,线程切换的时候,把某信号量置位。

#5


sleep会放弃时间片的。

#6


1.为什么要20ms耗尽?是为了解决什么问题?
2.主线程循环
  {
    //
    do{ 检测到某信号量退出, 干无聊事情浪费时间 }while(1);
  }
  内核代码里面改改,线程切换的时候,把某信号量置位。

#7


线程开始用 GetTickCount 函数得到个程序运行时间

线程结束 GetTickCount 得到个时间

2个时间相减

如果不够20ms sleep

但不知道这么做的精度够不够

#8


sleep 总归是不能用,得循环干垃圾活浪费掉时间片!
并且,内部计时得方式只是保证执行期长度,和线程得时间片本身不能等同处理。循环一次可能大于一个时间片。

#9


耗尽20ms是为了将时间均匀打散,这样数据显示不会闪烁,sleep会放弃时间片的啊

#10


在循环开始与结尾使用gettickcount计算时间,不够就循环,结束条件为时间到,这样应该可以,该内核太复杂了吧

#11


线程能不能使用完 整个时间片,不是你能决定的吧,是有内核调度决定的。而且这样做的目的是什么?

#12


放弃时间片怎么就导致数据显示闪烁了?多任务系统,没事情就应该放弃时间片,提高系统效率。
如果是为了数据显示不会闪烁。那应该显示那里去做处理,比如说使用内存DC双缓冲,合理使用裁减区等!


另外,如果要求你的程序每次循环之间都必须 >= 某时间的话,那gettickcount是可以考虑的。
exe_time = GetTickCount();
主线程循环
{
   while(GetTickCount() - exe_time<=20ms)
   {
      sleep(0);    // 这里就是立即放弃当前时间片,让其他任务处理。
      exe_time = GetTickCount();
   }
   // do your things
}

#13


上面的错了:

exe_time = GetTickCount();
主线程循环
{
  while(GetTickCount() - exe_time <=20ms)
      sleep(0);    // 这里就是立即放弃当前时间片,让其他任务处理。
  exe_time = GetTickCount();

  // do your things

#14


不需要Sleep,想把分线程的时间夺过来,提高主线程的优先级,这样分线程执行一段时间让主线程启动,把时间夺过来,不过要保护好数据,别没等显示,就被更新了。