为多线程场景重构单线程GUI代码

时间:2012-06-06 03:49:46

标签: c++ multithreading user-interface marshalling

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

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