3

通常情况下,有一个 MFC/Win32/WTL/wxWidgets/Qt 应用程序可以做一些有用的事情。它被设计为单线程的,并且有一些逻辑可以处理处理块中的错误/问题。

因此,在某个类的深处,可以触发一个对话框,询问用户“您确定要完成操作吗?”/“文档布局错误”或类似的东西。

问题是对话框是从计算量大/简单的代码中触发的。像 FFT/图像锐化/文件系统碎片整理功能,或类似的东西。如果不是 GUI,它可以很容易地在工作线程中启动。并且更适合那里,因为它可以避免对用户来说如此烦人的 GUI 停顿。

然而,GUI 不能在工作线程中工作,并且依赖注入几乎是不可能的,因为它会经过几层计算代码。从类接口的角度来看,这是一种非常不干净的方式,比如someclass instance(data_in, data_out, param1, param2, GUI_class_ref) : m_GUI(GUI_class_ref), ...3 级或更多级别。

如果代码被拆分为多个线程,是否有此类场景的模式/清单可用于将 GUI 提示编组回主线程并将结果返回到计算代码的核心?

4

2 回答 2

2

您可以创建同步上下文。它是由主线程执行的命令队列。工作线程将命令添加到此队列(必须锁定以进行单线程访问)并等待。主线程定期处理此队列,执行命令(例如,“取消操作”对话框)并通知工作线程有关结果。
在 C# 中,这是通过委托和调用它们的参数来完成的。在 C++ 中,您可以使用要在开关中处理的枚举编码消息(如 Windows 程序中的消息)。或者使用指向成员函数的指针 + 对象指针以从 + 参数调用它们来创建一些东西。

于 2012-06-06T05:03:40.833 回答
2

您正处于一个经典的旧代码重构十字路口。适当的隔离和依赖注入是不可行的,因此您只能让 GUI 上下文全局可访问。那就是创建一个单例。它不一定需要直接作为 GUI 上下文,因此至少可以实现一些隔离。它可以是某种具有 GUI 上下文并仅接受来自计算代码的特定目的调用的管理器。您可以使 GUI 线程类成为该管理器的朋友,并使 GUI 回调(在关闭对话框时)私有。

当我经历完全相同的挑战(现有重型应用程序的线程化)时,我可以给出更具体的想法。但是我很困惑您是否只希望 GUI 线程自由运行,或者也希望后台计算。您给出的示例对话框提示令人困惑,因为它建议需要回答一个决定,以了解是否继续(这意味着计算处于暂停状态)。

于 2012-06-07T09:25:08.673 回答