使用SetParent将窗口嵌入外部进程的消息循环问题

时间:2014-03-02 18:20:01

标签: multithreading delphi user-interface blocking sendmessage

我的Windows应用程序有一个标签式界面。每个选项卡都会呈现一些UI内容。众所周知,如果我在主线程中进行非常耗时的for循环而不让其他人处理任何Windows消息,那么应用程序将冻结。在冻结期间,我无法切换标签。

我的灵感来自Google Chrome的多进程架构。我尝试将SetParent用于embed a process into another process。更具体一点:流程A是主人。它可以创建无限的工作流程。每个工作进程都有自己的消息循环。如果进程B被冻结,则不应冻结进程A和任何其他工作进程。

其实我错了:如果我点击按钮工作进程B在主线程中不间断地执行大量UI工作,不仅会阻止进程B的UI,还会阻止进程A的UI ,直到我的测试代码结束。

有人可以分享一些灯吗?

1 个答案:

答案 0 :(得分:7)

你想要做的是,呃,要想做对。我建议你先阅读Raymond Chen的文章:Is it legal to call have a cross-process parent/child or owner/owned window relationship

  

创建跨线程父/子或所有者/拥有窗口关系隐式附加这些窗口所属的线程的输入队列,并且此附件是可传递的:如果其中一个队列连接到第三个队列,则所有三个队列都相互连接。更一般地说,由父/子链或所有者/拥有或共享线程关系相关的所有窗口的队列彼此连接。

这正是您描述的情景。并且可以预期所有消息队列的融合。您有多个进程的事实并没有改变您不能阻止UI线程的事实。

所以我认为你的程序设计存在缺陷。你正在增加一个史诗般的复杂性,没有奖励。多进程架构的好处是安全性和隔离性。关于阻止UI线程,您不会更改任何内容。解决问题的唯一方法是将长时间运行的任务放在非UI线程上。我的强烈建议是回归单一的流程设计。