通常情况下,有一个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提示编组回主线程,并将结果返回到计算代码的核心?
发布于 2012-06-06 13:03:41
您可以创建同步上下文。它是一个由主线程执行的命令队列。工作线程将命令添加到此队列(必须锁定此队列才能进行单线程访问)并等待。主线程定期处理这个队列,执行命令(例如,“取消操作”对话框),并将结果通知工作线程。
在C#中,这是通过委托和参数调用它们来完成的。在C++中,您可以在交换机中处理枚举编码的消息(就像Windows程序中的消息一样)。或者创建一些指向成员函数的指针+调用它们的对象指针+调用时使用的参数。
发布于 2012-06-07 17:25:09
你正处在一个传统的旧代码重构的十字路口。适当的隔离和依赖注入是不可行的,因此您只能使GUI上下文全局可访问。这就是创建一个单例。它不一定要直接作为GUI上下文,因此至少实现了一定程度的隔离。它可以是某种类型的管理器,它具有GUI上下文,并且只接受来自计算代码的特定目的调用。您可以使GUI线程类成为该管理器的朋友,并使GUI回调(在关闭对话框时)成为私有的。
我可以给出更具体的想法来写什么,因为我经历了完全相同的挑战(现有重型应用程序的三化)。但是我搞不懂你是想让GUI线程自由运行,还是想让后台计算也能自由运行。您给出的示例对话框提示符是令人困惑的,因为它建议了一个决定,需要回答该决定才能知道是否继续(这意味着计算被搁置)。
https://stackoverflow.com/questions/10907946
复制相似问题