关于定时器的问题

时间:2021-10-25 02:41:02
我使用一个定时器,定时1s,从下位机采集一个数据,显示数据和时间。开始的时候运行好好的,运行了3,4个小时之后,系统很卡,cpu占用100%,时间显示也不正确了,每10s就会出现一次跳格(1,2,3,4,6,7,8,9中间的5就没掉了),请问怎么修改可以避免cpu占用100%?
请大家帮帮忙,谢谢

7 个解决方案

#1


你先看看任务管理器,是哪个在大量占用CPU,如果是你这个Application的话,那就先从你的系统看起,主要看是不是启动了太多的线程(从任务管理器也可以看到线程数)

#2


就是我这个application

#3


一个timer不就是一个线程吗?java里面会自动处理无用资源,但是delphi里面我不太清楚怎么解决这个问题。程序很简单就是定时1s采集一个数据显示一下。

#4


一个timer怎么算是一个线程呢 线程要写到特定的线程函数里面去啊 ~

#5


嗯,大概我理解的不够透彻吧
我放了一个定时器,定时1s,每次从串口读1个数据,然后显示。
就这些操作。可是运行久了,cpu占用就上去了,那该怎么解决呢?

#6


定时处理程序大概就是这样的:
procedure TForm6.TimerTimer(Sender: TObject);
begin
    label_time.Caption:=getTime;
    label_ShowData.Caption:='当前温度:'+tempconver;
    memo_Receive.Text:=IntToStr(totalNum)+':('+tempature+')'+#10+memo_Receive.Text;
    memo_Conver.Text:=IntToStr(totalNum)+':('+tempconver+')'+#10+memo_Conver.Text;
    label_totalNum.Caption:='采集数据个数:'+IntToStr(totalNum);
    while True do
    begin
        MSComm.Output:='001?T'+#13;
        sleep(30);
        if MSComm.InBufferCount=13 then
        break
        else
        begin
          MSComm.InBufferCount:=0;
          MSComm.OutBufferCount:=0;
          continue;
        end;
    end;
    tempature:=MSComm.Input;
    tempature:=trim(tempature);
    tempconver:=Copy(tempature,4,Length(tempature));
    tempconver:=getTemp(tempconver);
    totalNum:=totalNum+1;
    MSComm.OutBufferCount:=0;
    MSComm.InBufferCount:=0;
end;

#7


主要内容就是:设置一个定时器,定时1s,每次从串口读1个数据,然后显示(同时显示采集时间)。

#1


你先看看任务管理器,是哪个在大量占用CPU,如果是你这个Application的话,那就先从你的系统看起,主要看是不是启动了太多的线程(从任务管理器也可以看到线程数)

#2


就是我这个application

#3


一个timer不就是一个线程吗?java里面会自动处理无用资源,但是delphi里面我不太清楚怎么解决这个问题。程序很简单就是定时1s采集一个数据显示一下。

#4


一个timer怎么算是一个线程呢 线程要写到特定的线程函数里面去啊 ~

#5


嗯,大概我理解的不够透彻吧
我放了一个定时器,定时1s,每次从串口读1个数据,然后显示。
就这些操作。可是运行久了,cpu占用就上去了,那该怎么解决呢?

#6


定时处理程序大概就是这样的:
procedure TForm6.TimerTimer(Sender: TObject);
begin
    label_time.Caption:=getTime;
    label_ShowData.Caption:='当前温度:'+tempconver;
    memo_Receive.Text:=IntToStr(totalNum)+':('+tempature+')'+#10+memo_Receive.Text;
    memo_Conver.Text:=IntToStr(totalNum)+':('+tempconver+')'+#10+memo_Conver.Text;
    label_totalNum.Caption:='采集数据个数:'+IntToStr(totalNum);
    while True do
    begin
        MSComm.Output:='001?T'+#13;
        sleep(30);
        if MSComm.InBufferCount=13 then
        break
        else
        begin
          MSComm.InBufferCount:=0;
          MSComm.OutBufferCount:=0;
          continue;
        end;
    end;
    tempature:=MSComm.Input;
    tempature:=trim(tempature);
    tempconver:=Copy(tempature,4,Length(tempature));
    tempconver:=getTemp(tempconver);
    totalNum:=totalNum+1;
    MSComm.OutBufferCount:=0;
    MSComm.InBufferCount:=0;
end;

#7


主要内容就是:设置一个定时器,定时1s,每次从串口读1个数据,然后显示(同时显示采集时间)。