XP下多线程占用CPU过高问题 (20分)

  • 主题发起人 主题发起人 mylu7735
  • 开始时间 开始时间
M

mylu7735

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了个通过串口实时采集数据的程序,端口读写部分在独立部分执行。
程序在Win98下运行良好,到了XP下后几乎无法使用,整个系统反应奇慢,
用任务管理器查看进程,发现程序占用了95%-98%的CPU时间。
虽然如此,但通讯响应(对下位机的响应)速度还不如在Win98下快,
难道XP的线种调度不如98下好,还是程序本身有问题?
线程执行框架大概如下;
type
TCommThread = class(TThread)
private
FHandle: THandle;
protected
procedure Execute;
override;
public
constructor Create;
destructor Destroy;
end;

constructor TCommThread.Create;
begin
inherited Create(True);
FHandle := CreateFile('COM1',
GENERIC_READ or GENERIC_WRITE, 0,
nil,
OPEN_EXISTING, 0,
0);
UpdateCommOptions;
// 设置串口通讯参数
end;

destructor TCommThread.Destroy;
begin
CloseHandle(FHandle);
end;

procedure TCommThread.Execute;
var
Cmd: Byte;
Errors: DWORD;
ComStat: TComStat;
Rst, TickCount: DWORD;
RxBuf: array [0..15] of Byte;
begin
while not Terminateddo
begin
PurgeComm(FHandle, PURGE_RXABORT + PURGE_RXCLEAR);
// 清除接收缓冲区
WriteFile(Fhandle, Cmd, 1, Rst, nil);
// 发送查询指令
TickCount := GetTickCount;
// 等等下位机响应
while not Terminateddo
begin
ClearCommError(FHandle, Errors, @ComStat);
// 检查是否不数据并判断是否超时
if (ComStat.cbInQue < 10) and (GetTickCount - TickCount < 100) then
Break else
begin
ReadFile(FHandle, RxBuf, 10, Result, nil);
// 读取数据
........
//处理接收加来的数据
........
end;

end;
end;
end;
 
在两个While循环体中都加上一句Sleep(100)试试
 
ylong.com:
程序对下位的查询不能停止,这个使用环境条件要求的,PC机对200多台下位机的查询必须做出尽快的响应,每次循环都sleep(100)对下位机来说是不能接受的!
 
你应当把发送和接受分为两个线程,即一个线程处理发送,一个线程处理接受.
 
谢谢 ylong.com, z94264, lichengbin。
总是已经解决了,我把对端口的读写方式改变一下后对CPU时间的占用明显下降了。
改写方式如下:
var
Overlapped: TOverlapped;
begin
...
FEvent := CreateEvent(nil, True, False, nil);
while not Terminateddo
begin
FillChar(Overlapped, SizeOf(Overlapped), 0);
Overlapped.Event := FEvent;
ReadFile(FHandle, RxBuf, 10, Result, @Overlapped);
...
// 用WaitForSingleObject等待I/O操作完成
// 再用GetOverlappedResult取得成功读取的数据字节数
...
// 处理接收到的数据
end;
 
后退
顶部