c++ - 在长时间处理期间与 GUI 交互

标签 c++ user-interface mfc

我有一个类层次结构:

class BaseProcess
{
    public virtual void Execute() = 0;  

};

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

        //Need to call back to the GUI here, maybe to get a file path from a file selector

        //Do Something Else

        //Now want to update the GUI with the progress of the operation perhaps

        //More processing   
    }
};

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

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

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

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

更新:

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

最佳答案

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)
{
}

关于c++ - 在长时间处理期间与 GUI 交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13178379/

相关文章:

c++ - 给定一个数组和整数 k 在每个大小为 k 的子数组中找到最大值

c++ - 使用 C 代码执行 Bash 命令

c++ - 如何使用表单扩展 QTabWidget

visual-c++ - 如何在 MFC 中选中和取消选中以及启用和禁用复选框控件

c++ - 如何写入文件然后读回以验证其内容,确保您获得的是磁盘上的内容而不是缓存

visual-c++ - 捕获 OpenGL/Direct3D 第 3 方应用程序的屏幕截图

c++ - 获取随机元素并将其删除

c++ - 如何在一元谓词中使用类成员变量?

Android ProgressDialog 显示但进度未更新

java - BufferedImage 产生黑色输出