单线程做了个定时器,发现很占用CPU

时间:2022-06-03 23:33:28
我在一个线程函数里,让程序监视系统当前时间,如果到某一时间发出提醒。代码如下:
while(true)
{
   if(DataTime.Now<startTime)
   {
      bool waiting=true;
   }   
   // 下面就是发出处理消息
}
发现这样做很占用系统资源,请高手指点一下,如何解决这个问题,谢谢。

9 个解决方案

#1


怎么能这样写代码?
如果需要等待,使用sleep呀。

把你的代码全贴出来。

#2


这样做当然很占资源了.

考虑使用System.Threading.Timer.

#3


private void threadStart()
{
// 计算是否到起始时间
DateTime temp=base.timeSetting.startTime;//temp表示起始时间
while(true)
{
Timer.TimeManagerSetting setting=base.timeSetting;
while(temp>DateTime.Now)
{
// 等待
bool waitingStart=true;
}

// 计算是否到结束时间
temp=temp+timeSetting.frequency;// temp表结束时间
while(temp>DateTime.Now)
{
bool waitingEnd=true;
}
this._tm.timeUp();
}
}

#4


上述代码主要实现的功能是:给定一个周期,就是程序中的timeSetting.frequency,每隔这么一段时间发一个消息。我的思路是用一个线程不断系统时间,如果到时间就法消息,如果时间不到,就等待。大部分时间是在等待状态,我不知如何实现这种功能,于是就做了一个死循环,请高手指点一下如何处理这种问题,感激不尽。

#5


使用Timer控件,很方便!!

#6


使用Timer控件,在Elasped的事件里处理你的消息
重要的是将Timer控件的interval(是以毫秒为单位)设为你的timeSetting.frequency。

#7


Thread.sleep(50)
..................

#8


还是不是很明白,先暂时修改为以下:

private void threadStart()
{
// 计算是否到起始时间
DateTime temp=base.timeSetting.startTime;//temp表示起始时间
while(true)
{
Timer.TimeManagerSetting setting=base.timeSetting;
while(temp>DateTime.Now)
{
// 等待
Threading.Sleep(50);
}

// 计算是否到结束时间
temp=temp+timeSetting.frequency;// temp表结束时间
while(temp>DateTime.Now)
{
Threading.Sleep(50);
}
this._tm.timeUp();
}
}

#9


谢谢你,笨牛,呵呵。

#1


怎么能这样写代码?
如果需要等待,使用sleep呀。

把你的代码全贴出来。

#2


这样做当然很占资源了.

考虑使用System.Threading.Timer.

#3


private void threadStart()
{
// 计算是否到起始时间
DateTime temp=base.timeSetting.startTime;//temp表示起始时间
while(true)
{
Timer.TimeManagerSetting setting=base.timeSetting;
while(temp>DateTime.Now)
{
// 等待
bool waitingStart=true;
}

// 计算是否到结束时间
temp=temp+timeSetting.frequency;// temp表结束时间
while(temp>DateTime.Now)
{
bool waitingEnd=true;
}
this._tm.timeUp();
}
}

#4


上述代码主要实现的功能是:给定一个周期,就是程序中的timeSetting.frequency,每隔这么一段时间发一个消息。我的思路是用一个线程不断系统时间,如果到时间就法消息,如果时间不到,就等待。大部分时间是在等待状态,我不知如何实现这种功能,于是就做了一个死循环,请高手指点一下如何处理这种问题,感激不尽。

#5


使用Timer控件,很方便!!

#6


使用Timer控件,在Elasped的事件里处理你的消息
重要的是将Timer控件的interval(是以毫秒为单位)设为你的timeSetting.frequency。

#7


Thread.sleep(50)
..................

#8


还是不是很明白,先暂时修改为以下:

private void threadStart()
{
// 计算是否到起始时间
DateTime temp=base.timeSetting.startTime;//temp表示起始时间
while(true)
{
Timer.TimeManagerSetting setting=base.timeSetting;
while(temp>DateTime.Now)
{
// 等待
Threading.Sleep(50);
}

// 计算是否到结束时间
temp=temp+timeSetting.frequency;// temp表结束时间
while(temp>DateTime.Now)
{
Threading.Sleep(50);
}
this._tm.timeUp();
}
}

#9


谢谢你,笨牛,呵呵。