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;
程序在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;