如何让串口的收发在不同的线程中进行(200分)

  • 主题发起人 主题发起人 pickup
  • 开始时间 开始时间
P

pickup

Unregistered / Unconfirmed
GUEST, unregistred user!
这个问题好像有人问过了,但是我觉得还是不太满足我的要求。我现在编写一个控件对
一个设备通过串口编程。使用SPPcomm。现在的方法是另外有一个线程负责向串口发送各
种各样的命令,主线程负责接收数据(Spcomm.Tcomm.onReceiveData)是TForm的成员函数
也只能是TForm的成员函数(不知道是不是这样)。现在的问题是我在开始启动的时候想要
监测设备是否正常工作,就需要向设备发送特定的命令(在主线程中和另外的线程中都可)
,然后等待设备反馈如果在一定时间内有反馈那么发送一个消息说明设备工作正常,但现
在的问题时我在主线程中等待时,onReceiveData就拿不到控制所以,即使是设备的反馈
已经到来,onReceiveData也不能执行那么等待反馈的程序总是超时。我现在就像怎么能
让接受字符的回调函数在主线程以外线程空间中运行。不知道那位大虾能解决这个问题
谢谢了。
 
直接修改Spcomm的不就可以了,或者在等待循环时用 application.ProcessMessages
 
SPcomm也是运行在主线程中的,所以主线程等待时SPcomm一样拿不到控制。和以前的
情况是一样的。还有如果用application.ProccessMessages那么组件实际上就和应用
程序耦合到一起了。这样组件就没有通用性了。
 
应该把你的接受字符的回调函数放在一个新的线程中执行,当主线程串口收到接收到返回
信息时,将一个全局变量置TRUE,新的线程中在一定时间内检测到这个变量为TRUE就说明
已经收到信息了,再分析处理这个信息返回。。等待。。同样的道理。
 
问题是怎么样实现让回调函数单独在线程中运行呢?请指教?
 
新建一个线程啊
oncecom=class(tthread)
private
ot:dword;
protected
procedure execute;
override;
public
constructor create(const iot:dword);
end;
然后写它的execute事件就行了。
 
还是不太明白
OT是回调函数的入口指针吧?那么,Execute你面做什么事情呢?
应为回调函数是系统调用的而不能显式的调用。
 
不是,OT在这的线程里是超时时间。
 
后退
顶部