重构多线程方案的单线程 GUI 代码



通常情况下,有一个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 提示编组回主线程并将结果返回到计算代码的核心?

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

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

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

最新更新