是否每个VCL表单都有自己的消息循环/泵进行线程化?

时间:2011-03-12 18:02:54

标签: c++ multithreading c++builder vcl message-pump

我正在尝试在我的最新项目中实现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();

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

修改

如果您没有可见的主表单,请问如何使用VCL运行消息循环。您有两种选择:

  1. 在致电pApplication->Run();之前创建一个不可见的表单。
  2. 运行您自己的消息循环。
  3. 在我看来,选项1是迄今为止更好的选择。

答案 1 :(得分:1)

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

此外,每个表单都已包含它自己的消息循环。 TApplication只是将消息分派给每个表单的循环。