我正在更新用VB6编写的遗留代码,而且我遇到了对互斥锁的需求。我有两个插座,我需要从各种来源发送和接收。所以我计划让一个插座持续监听传入连接,然后另一个用于发送或接收。
如果连接已进入,则计时器每秒检查二十次,如果是,则使用第二个套接字接受它,然后立即再次开始侦听。如果第一个连接在第一个连接完成之前进入,则需要等待(在C#中我会对其进行锁定并将其调用完毕。)
此外,如果程序需要发送数据,我将使用第二个套接字,并连接到远程主机。因此,如果第二个套接字已经接收数据,它也需要阻塞。
我不熟悉VB6中的多线程 - 这是一个问题,还是计时器的Tick
事件总是在与其他所有事件相同的线程上引发?
答案 0 :(得分:4)
Tick事件始终在同一个线程上引发。一切都会自动阻止,因为只有一个线程。
VB6中的多线程在我看来并没有真正起作用,除了using一个ActiveX EXE项目:有various hacks来实现多线程工作但它们对我来说是犯规,尽管其他人发誓他们。
答案 1 :(得分:3)
如果您使用标准的VB6 winsock控件,您甚至不必担心使用计时器,在建立连接时会触发事件(是的,这是在主线程上)。对于“锁定”,你必须非常小心的是,如果在代码中有DoEvents,你可能会陷入糟糕的情况,因为这会抽取消息循环,你可以在其中运行其他函数的代码。调用DoEvents的函数。如果您需要DoEvents来保持程序“响应”,那么您可以使用简单的布尔值作为锁,因为VB6不是多线程的。 MarkJ是正确的,你必须走得很远,做一些非常粗略的事情才能让VB6成为多线程而不使用ActiveX EXE项目。