0

我有一个班级层次结构:

类 BaseProcess
{
    公共虚拟无效执行()= 0;  

};

类子进程:BaseProcess
{
    公共虚拟无效执行()
    {
        //做点什么

        //这里需要回调GUI,可能是从文件选择器中获取文件路径

        //做其他事情

        //现在想用操作的进度更新GUI

        //更多处理   
    }
};

假设从 GUI 按钮事件处理程序创建和调用 SubProcess 对象...

我的问题是从 Execute() 函数中与 GUI 交互的最佳方式是什么?(还假设 Execute() 可能在不同的线程上运行)

我的想法是将回调传递给 SubProcess 对象,因为这将允许我将信息发送到 GUI,但是在文件选择器的情况下,将数据返回给 SubProcess 对象的最佳方法是什么? 我希望解决方案尽可能通用,以便我可以根据请求返回不同类型的数据。

注意:请忽略任何代码错误,我快速拼凑示例只是为了说明问题

更新:

很抱歉,这将在 Windows,MFC 上。我不确定这有多重要,因为我认为整体设计应该适用于大多数 GUI 框架?

4

4 回答 4

2
class SubProcess : BaseProcess
{
    public virtual void Execute()
    {
        //Do Something

        char file_name[MAX_PATH +1];
        myWindow->SendMessage(WM_GETFILE, max_path, (LPARAM)file_name); 

        //Do Something Else

        myWindow->SendMessage(WM_UPDATE, 50);

        //More processing   
    }
};

在窗口类中:

#define WM_GETFILE (WM_USER+1)
#define WM_UPDATE (WM_USER+2)

BEGIN_MESSAGE_MAP(CMyWindow, CWnd)
    ON_MESSAGE(WM_GETFILE, MyGetFileHandler)
    ON_MESSAGE(WM_UPDATE, MyUpdateHandler)
END_MESSAGE_MAP()

LRESULT CMyWindow::MyGetFileHandler(WPARAM wParam, LPARAM lParam)
{
}
LRESULT CMyWindow::MyUpdateHandler(WPARAM wParam, LPARAM lParam)
{
}
于 2012-11-01T13:58:19.560 回答
1

我前段时间使用的 MFC 技术是基于标准的空闲循环处理。

这是一种简单的方法,因为在主线程中运行,您的工作人员可以直接作用于 GUI 对象。

如果您“足够频繁地”从工作进程调用消息循环,则 GUI 将保持平稳运行。

如果您可以承受开发周期中的一些复杂性,则可以改用线程,但根据我的经验,它更难。

于 2012-11-01T14:06:58.407 回答
0

取决于图形用户界面。如果您在一个 GUI 允许您从不同线程控制它的系统上,那么您可以从 Execute() 中进行直接 GUI 调用。如果 GUI 不允许这样做,那么您可以通过消息与主线程通信,在那里进行 GUI 调用,并将结果返回给 Execute() 线程。

Qt使用它的信号和槽机制,使得实现这一点相当直接的 GUI 框架。

于 2012-11-01T13:51:58.980 回答
0
class GuiCallback
{
 public:
     string getFilePath () {/*show the dialog and return the path*/}
     void update (/*arguments with data*/) {}
};
class BaseProcess
{
    public virtual void Execute(GuiCallback*) = 0;  

};

class SubProcess : BaseProcess
{
    public virtual void Execute(GuiCallback* callback)
    {
        //Do Something

        string path = callback->getFilePath ();

        //Do Something Else

        callback->update (...);

        //More processing   
    }
};

实现getFilePathupdate将取决于您使用的平台/gui 框架

于 2012-11-01T13:54:02.323 回答