几年前我的一个应用程序将某个应用程序必须对某些串行事件做出快速响应时,将我的串行处理移动到一个线程。
它是在BDS2006中,有一个旧版本(有些3.x?)它是通过在tthread.execute中使用这样的代码完成的:
while ...
begin
events:=[evRxChar];
{ Prepare a stop event for killing a waiting communication wait. }
try
comport1.WaitForEvent(events,stopevent.handle,500);
if evRxChar in events then
ComPort1RxChar(comport1,comport1.InputCount); // method of thread.
on e: exception do {only logs} ;
end;
初始化就像
procedure TSerThread.initcomport(comportname:string='COM1');
begin
comport1:=tcomport.create(nil);
ComPort1.BaudRate:=br115200;
ComPort1.DataBits:=dbEight;
ComPort1.Port:=comportname;
ComPort1.StopBits:=sbOneStopBit;
ComPort1.Events:=[];
ComPort1.Connected:=true;
StopEvent := TEvent.Create(nil,{ManualReset}false,{InitialState}false,'StopEvent');
end;
rxchar方法读取使用 comport1.readstr()
我最近不得不深入研究,并注意到它在我的Delphi XE中没有工作,后者有tcomport4。从源头上看,我看到了这些评论 comport4改变了它处理内部线程的方式("重叠"属性),但默认似乎是" true"有评论"经典",我
假设这意味着与旧版本兼容。
请注意,协议是二进制的,并且所有字符串,char< - > ansistring,ansichar的更改已经像我在普通的主线程版本中那样完成了
现在真正的问题:
我仍然正在调试正在发生的事情,但是我很着急,就在我发布这篇文章的时候,希望能快速获得指针。
更新
我重新安装了一个旧的turbo delphi副本,并验证了它与v3一起工作。我在代码路径中修复了一个小bug但与我的想法有所不同(不在上面的代码中)
这允许我更好地描述dxe / comportv4和bds2006 / comportv3之间的行为; v4代码生成更多的读取事件(数百/秒)。似乎读取不会从传入队列中删除读取字符。
更新2
我使用最新版本进行了快速测试,并进行了必要的重新排列(杀死字符串函数用于基本上是二进制协议)。我被困了一段时间,因为应用程序在启动时崩溃,但那是因为我使用gnugettext,而Comport打包了一个不同的(非unicode甚至?)版本。但在那之后可行。
不幸的是,传播回生产版本(完全编写协议解码)的风险有点变化,因此我必须使用inbetween版本(4.0到4.11f之间)进行测试。我会在适当的时候这样做,任何建议哪个版本是最后一个readtr(ansistring)?
更新3
最后,我简单地重命名了4.11f单元,并将它们与旧版本并行使用,使用4.11f作为线程代码库,使用旧代码维护现有代码。
长期来看,我可能只需要使用waitforevent代码并创建一个自己的版本。它的主要问题是,无法查看等待是否在超时,stopevent或其他任何情况下终止。这意味着如果你想要,你需要另一个计时器。定期发送。