2011-03-10 96 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