2

我正在尝试在我的最新项目中实现 MVP 模式。目前使用 C++ Builder 2007 附带的 VCL 库。我的想法是我不需要执行 Application->Run(),或者更糟糕的是 Application->CreateForm(),它创建一个主窗体并在该窗体上循环。我不想要一个主表单,我想要一个主Presenter

然后我的问题变成了如何创建线程化的 TForms?

选项 1: 如果只有一个消息循环(Presenter),那么我系统中的每个随机线程都必须向该主线程发布消息并让它创建表单。

选项 2: 每个表单都有自己的消息循环。现在随机线程可以根据需要新建和删除它们。发布消息仍然用于它们之间的通信。

如果建议使用选项 2,是否有人对实施这种方法有任何建议?

编辑: 我如何更改以下内容以允许使用new创建表单并仍然允许循环工作?

// Start VCL library
pApplication->Initialize();

// Create the Main form and assign the MainForm property
pApplication->CreateForm(__classid(TForm1), &pFormMain);

// Show the form
pFormMain->Show();

// Run the loop
pApplication->Run();
4

2 回答 2

3

您不会将每个表单放在自己的线程中。您将每个表单放在主线程中。

一个线程只有一个消息循环。例外情况是在以模态方式显示表单时运行的特殊消息循环。

pApplication->Run();运行您的消息循环。当发布的消息被处理时,它们被分派到适当的窗口过程。当消息被发送时,它们被同步地直接传送到窗口过程。

您可以创建和显示任意数量的表单,并从同一个消息循环中为它们提供服务。您不仅可以做到这一点,而且是做事的方式。

如何将这些知识映射到 MVP 框架中是另一回事,但是在任何解决方案中,在单个线程之外运行 GUI 是一个固定点。

编辑

你问如果没有可见的主窗体,如何使用 VCL 运行消息循环。你有两个选择:

  1. 在调用之前创建一个不可见的表单pApplication->Run();
  2. 运行您自己的消息循环。

在我看来,选项 1 是迄今为止更好的选择。

于 2011-03-12T18:55:39.590 回答
1

您不能使用 VCL 安全地创建线程表单,因为 VCL 不是线程安全的。

此外,每个表单已经包含它自己的消息循环。TApplication 只是将消息发送到每个表单的循环。

于 2011-03-12T18:11:25.090 回答