2010-07-20 111 views
1

我正在更新用VB6編寫的遺留代碼,而且我遇到了互斥體的需求。我有兩個套接字,我需要從各種來源收發。所以我打算讓一個套接字連續監聽傳入的連接,然後另一個套接字用於發送或接收。在多線程VB6中使用互斥體

如果連接已經進入,定時器會檢查二十次,如果是,則使用第二個套接字接受它,然後立即再次開始偵聽。如果第二個連接進來之前,首先完成接收數據,則需要等待(在C#我在它拋出一個鎖,把它完成。)

此外,如果程序需要發送數據,我將使用第二個套接字,並連接到遠程主機。所以如果第二個套接字已經接收到數據,它也需要阻塞。

我不熟悉VB6中的多線程 - 這是一個問題,還是計時器的Tick事件始終在與其他所有內容相同的線程上引發?

+0

什麼阻止你創建一個支持COM的C#程序集並從舊的VB6項目調用它?聽起來你可能會有更多的成功。 – MCain 2010-07-20 17:14:32

回答

4

Tick事件總是在同一個單獨的線程中產生。因爲只有一個線程,所有東西都會自動阻塞。

在我看來,VB6中的多線程並沒有真正的工作,除了一個ActiveX EXE項目using:有various hacks可以讓多線程工作,但他們聽起來對我來說是犯規,儘管其他人發誓他們。

3

如果你使用標準的VB6 winsock控件,你甚至不用擔心使用定時器,當連接建立時(以及在主線程中)事件將會觸發。唯一需要非常小心的「鎖定」是,如果代碼中包含DoEvents,則可能會導致不好的情況,因爲這樣可以抽取消息循環,並且可以使用來自運行在其中的其他函數的代碼函數調用DoEvents。如果您需要DoEvents來保持程序「響應」,但是您可以使用簡單的布爾值作爲鎖,因爲VB6不是多線程的。 MarkJ是正確的,你必須走得非常遠,做非常粗略的事情才能讓VB6成爲Multithreaded而不使用ActiveX EXE項目。