如何使用 std::async 显示 Cdialog

Posted

技术标签:

【中文标题】如何使用 std::async 显示 Cdialog【英文标题】:How to show Cdialog with std::async 【发布时间】:2019-12-17 01:22:42 【问题描述】:

我有一个名为 A 的派生类继承自 CDialog,我为 A 创建了一个名为 a 的对象,并希望利用成员函数 domodal 来显示对话框。尽管如此,此对话框无法显示,并且父窗口被阻止。

A a(this);

auto DlgResult = std::async(std::launch::async, &A::DoModal,&a);

DlgResult.wait();

if (DlgResult.get() == IDOK)

    std::wstring ss = a.get_text_fromdlg();

谁能帮帮我,谢谢!

【问题讨论】:

将所有 GUI 活动保存在一个线程中。 @seccpur 谢谢你的重播,我会记住的。我只是试图让它异步。 您想要专门的std::async,还是仅仅想要一个非阻塞对话框? MFC 早于std::async,并且有其他工具可以防止 CDialog 阻塞 UI 线程。这个 SO 问题有一些例子:***.com/questions/2271821/… @parktomatomi 目前,如果我使用 std::async,对话框无法显示,我想使用 std::async 显示对话框...... 对于非阻塞对话框,使用无模式对话框。 【参考方案1】:

如果我是你,我不会与 Async 和 DoModal 搏斗,因为 DoModal() 的目的是等待对话框的响应,让应用知道如何继续前进。

下面,我添加了一个更简单的选项。只需创建指向 Dialog 类的成员变量指针,然后使用 Show Window。此外,在这种情况下,您可以考虑将对话框置于最上方,以免失去焦点。

MFCClass1* m_pDlg = new MFCClass1();

void CMFCApplication1Dlg::OnBnClickedButton1()

    m_pDlg->Create(IDD_DIALOG1);
    m_pDlg->ShowWindow(SW_SHOWNORMAL);
    SetWindowPos(&m_pDlg->wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

【讨论】:

这不是您确保对话框始终在其所有者面前的方式。您只需将拥有窗口传递给CDialog 的c'tor(不幸的是名称为pParentWnd)。完成。

以上是关于如何使用 std::async 显示 Cdialog的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 std::async 任务是不是完成?

如何将此 std::function 传递给 std::async

使用 std::future 和 std::async 的依赖求解器

为啥 std::async 使用同一个线程运行函数

使用多线程加速(std::async、std::thread 还是?)

使用 std::async 时 C++“无法推断模板参数”