几年前,对于我的一个应用程序,我把我的串行处理移到了一个线程上,当某个应用程序必须对某些串行事件做出非常快速的响应时。
它在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中不起作用,它有tcomport4。在源代码中我看到一些备注,comport4已经改变了它处理内部线程的方式(“重叠”属性),但是默认值似乎是"true“,有一个注释”经典“,我
假设这意味着与旧版本兼容。
请注意,协议是二进制的,所有字符串、char<-> ansistring、ansichar更改都已完成,就像我在普通的主线程版本中所做的那样。
现在真正的问题是:
我仍然在调试正在发生的事情,但是我很匆忙,这是我发布这篇文章的时候,希望能快速获得指针。
更新
我重新安装了一个旧的turbo副本,并验证了它在那里与v3一起工作。我修正了一个小错误,尽管在代码描述中,它与我想的有一点不同(不是在上面的代码中)。
这允许我更好地描述dxe/comportv4 4和dxe 2006/comportv4 3之间的行为;v4代码生成更多读取事件(数百/秒)。看起来,read并没有从传入队列中删除读字符。
更新2
我对最新版本进行了快速测试,并进行了必要的重新安排(基本上是二进制协议使用了杀死字符串函数)。我被困了一段时间,因为应用程序在启动时崩溃了,但这是因为我使用gnugettext,而Comport包则是不同的(非unicode?)版本。但是在那个之后,它就可以运行了。
不幸的是,将这些更改传播回生产版本(完全编写协议解码)有一定的风险,因此我将不得不使用inbetween ( 4.0到4.11f)进行测试。我会在适当的时候这样做,有什么建议吗?最后一个版本是readstr(ansistring)?
更新3
最后,我简单地重命名了4.11f单元,并将它们与旧版本并行使用,使用4.11f作为线程代码库,使用旧代码维护现有代码。
长期而言,我可能只是简单地采用了等待程序代码,并制作了自己的版本。它的主要问题是afaik无法查看等待是否在超时、停工或其他情况下终止。这意味着,如果想要定期发送,就需要另一个计时器。
发布于 2011-12-19 20:44:04
您需要升级到最新的稳定版本4.11版本这里。
https://stackoverflow.com/questions/8563368
复制相似问题