【问题标题】:Using mutexes in multithreaded VB6在多线程 VB6 中使用互斥锁
【发布时间】:2010-07-20 16:57:49
【问题描述】:

我正在更新用 VB6 编写的遗留代码,并且遇到了对互斥体的需求。我有两个套接字,我需要从各种来源发送和接收。所以我打算让一个套接字持续监听传入的连接,然后另一个用于发送或接收。

如果有连接进来,计时器每秒检查二十次,如果是,则使用第二个套接字接受它,然后立即重新开始侦听。如果第二个连接在第一个连接完成接收数据之前进入,它需要等待(在 C# 中,我会对其进行锁定并调用它完成。)

另外,如果程序需要发送数据,我将使用第二个套接字,并连接到远程主机。所以如果第二个套接字已经接收到数据,它也需要阻塞。

我不熟悉 VB6 中的多线程 - 这是一个问题,还是计时器的 Tick 事件总是在与其他所有线程相同的线程上引发?

【问题讨论】:

  • 是什么阻止您创建支持 COM 的 C# 程序集并从您的旧版 VB6 项目中调用它?听起来你可能会更成功。

标签: multithreading sockets vb6 mutex


【解决方案1】:

Tick 事件总是在同一个线程上引发。一切都会自动阻塞,因为只有一个线程。

在我看来,VB6 中的多线程并没有真正起作用,除了 using 一个 ActiveX EXE 项目:有 various hacks 可以让多线程工作,但它们对我来说听起来很糟糕,尽管其他人发誓他们。

【讨论】:

    【解决方案2】:

    如果您使用标准的 VB6 winsock 控件,您甚至不必担心使用计时器,事件会在建立连接时触发(是的,那是在主线程上)。对于“锁”,您唯一需要非常小心的是,如果您的代码中有 DoEvents,您可能会陷入糟糕的境地,因为这确实会泵送消息循环,并且您可以让其他函数的代码在中间运行调用 DoEvents 的函数。如果您需要 DoEvents 来保持程序“响应式”,但是您可以使用简单的布尔值作为锁,因为 VB6 不是多线程的。 MarkJ 是正确的,你必须不遗余力地做一些非常粗略的事情才能在不使用 ActiveX EXE 项目的情况下让 VB6 成为多线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多