0

根据另一个问题的答案,如果创建它的线程很忙,则无法更新 VB 用户界面:因此为什么大型计算作业通常必须进入后台任务。

这就是神秘的东西。我有以下代码。它在进程内 COM 上调用,像这样

  1. 客户来电showform()
  2. 客户端做了大量的工作,在这个过程中冻结了自己的 UI
  3. 客户端完成工作,返回更新自己的 UI

在第 2 步,VB 表单在那里但被冻结 - 您无法与之交互。在第 3 步,VB 表单变得可用。但这是为什么呢?执行线程肯定已经返回给客户端了吗?如果客户端以某种方式处理表单的事件,它通过什么魔法知道要处理哪些事件以及将它们发送到哪里?

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1

  Public Sub New()
      MyBase.New()
  End Sub

  Private f1 As Form1

  Public Sub showform()
      f1 = New Form1()
      f1.Show()
  End Sub

End Class
4

2 回答 2

2

你所说的魔法是 Windows 编程的基础。我对您上一个问题的回答解释了为什么以及如何解决此问题。当进行 COM 调用时,客户端应用程序只需将您的过程导入到他们的应用程序中。无论他们是通过自己键入代码来创建表单,还是使用您键入的代码来创建表单,都不会改变对象/所有者关系的性质。对您的 COM 调用showForm仍将f1属于进行调用的线程(客户端 UI 线程)。该窗口的窗口句柄仍将由创建它的 UI 线程(客户端)负责。

创建一个表单只会创建一个邮箱(窗口句柄)。UI 线程是一个邮递员(消息泵循环)。您没有为客户提供一个新的邮递员,而只是一个带有邮箱的新对象。当客户端程序通过对您的过程进行 COM 调用来创建窗口时,它(客户端 UI 线程)负责将消息传递到新表单的邮箱(将其窗口句柄注册到主 UI 线程)。他们的邮递员仍然需要向您发送消息以使您的视觉对象正常工作。如果他正忙于将 pi 计算到小数点后一万亿位,那么您的对象就会像他的邮件路线上的其他所有东西一样冻结。

于 2012-06-23T09:16:36.893 回答
0

检查 form.load 事件。表单加载并运行代码......这就是它冻结的地方。

于 2012-06-23T08:59:34.920 回答