2011-03-10 100 views
0

我支持涉及串口通信的应用程序。mscomm oncomm事件

有形式32个的MSComm(对照组)。而在同一个线程的一些其他的代码运行时(比如数据库访问等)

假设数据在COM端口的一个到达。 Oncomm事件过程是否被排队等待执行或当前执行点是否被排队并执行Oncomm事件处理程序?

+0

我不确定我是否明白你在问什么......是的,沟通事件将排队;你的事件处理程序中的代码将不会被执行,直到线程完成它目前正在做的任何事情。您的数据库访问将不会被抢占。 – 2011-03-10 10:07:28

+1

某些数据库操作也可以异步完成。与“线程完成正在执行的任务”无关,因为它是您的代码返回到程序的消息循环。在VB6中,这意味着退出当前的事件处理程序。 – Bob77 2011-03-10 17:01:51

回答

1

VB6是单线程的。基本上(除了ActiveX控件一秒)只有GUI线程。

它坐在那里等待一个事件。你得到的数据,所以它进入你的MSComm控件的事件处理程序,并开始做一些数据库访问。它阻止等待数据库响应。另一个MSComm控件接收数据并触发事件。此事件仅在Windows事件队列中。 GUI线程必须在可以处理其他MSComm事件之前退出事件处理程序。

当然,在事件处理程序的中间,你可以叫DoEvents。我强烈建议你很少,如果有的话,那样做。根据我的经验,这是许多难题的根源。

ways排队长时间运行的数据库的工作到后台线程(使用调用到.NET托管代码,在这种情况下)。这将允许您的事件处理程序代码几乎立即继续而不会阻塞,从而允许它处理下一条消息。据我所知,没有原生VB6的方式来做到这一点。

+0

嗨斯科特,这是调用DoEvents的副作用(我正在使用延迟功能)?如果我们不调用DoEvents,线程阻塞OS.Am我是对的? – ramu 2011-03-11 04:34:55

+1

@ramu - 操作系统未被阻止。正如我所说,在VB6中有一个主要的GUI线程。该线程可以阻塞任何长时间运行的任务或函数调用。一旦你执行了一些长时间运行的函数调用,你无法调用DoEvents,所以它不会帮助你。它的作用是暂停执行事件处理程序以处理其他事件。通常这是一个设计不佳的标志。通常可以用一个定时器替换它,这个定时器定期执行你想要的工作,然后在没有更多工作时退出它的事件处理器。 – 2011-03-11 12:46:31