【问题标题】:Run a form in a separate thread在单独的线程中运行表单
【发布时间】:2013-03-04 10:38:18
【问题描述】:

假设我有一个表单 Foo。 即使主应用程序线程可能正忙于做其他事情,我如何创建一个在它自己的线程中运行并得到更新的实例?例如处理阻塞网络通信或类似的事情。

我了解基本原理,并且我需要创建一个新线程,在该线程中创建表单实例等。但是我认为我需要该线程/窗口的更新循环,但我完全不确定那是怎么做的应该看看。

【问题讨论】:

  • VCL 在主线程上运行所有表单,如果主线程阻塞则整个应用程序阻塞。
  • @GregorBrandt:谢谢。所以即使在辅助线程中创建的表单仍然连接到主线程并从主线程运行?你有这方面的参考吗?为什么 VCL 总是必须不同 ;)。

标签: c++builder vcl c++builder-2010


【解决方案1】:

您不应在主应用程序线程之外的任何线程中创建表单,因为 Windows 消息队列仅与此主线程相关联。
换个思路:为了确保您的表单始终保持更新和响应,请为繁忙的工作(例如处理阻塞 newtork 通信等)创建单独的线程,而不是为表单创建单独的线程。在这种情况下,创建新线程后,主窗体继续从其队列中抽取消息,而不同线程中的函数正在执行您需要的脏工作。当工作线程完成时,它可以使用PostMessage() WinAPI 函数将结果通知主线程。您只需在表单中为此类自定义消息提供处理程序,它们将与工作线程无缝通信。
此外,如果您的“忙碌工作”不是很复杂,您甚至可以不使用额外的线程,通过在表单线程中运行您的工作,并且不时调用ProcessMessages() 函数,以保持表单更新。

【讨论】:

  • 这是针对已经存在的大型应用程序。有一个表单显示和更新而不关心主线程是否陷入困境是解决这个问题的快速方法。否则必须重新编写大量代码。有人告诉我这是可行的,并且新表单可以有自己的消息处理线程。这样做的用途是在主线程工作时显示(和动画)通知。
  • 从多线程到多进程并创建单独的迷你应用程序显示您需要的表单可能会很有用。标准的 Windows 消息传递可用于在表单之间进行通信,在这种情况下不需要与制作单独队列相关的额外工作。
  • 好吧,因为我希望那个“弹出窗口”能够“锁定”主窗口,这有点繁琐。奇怪,因为它在 C# 甚至 C++ MFC 中都很容易。 stackoverflow.com/questions/3990857/…
猜你喜欢
  • 2012-05-20
  • 2013-09-26
  • 2019-08-12
  • 2015-01-24
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多