如何使用 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::function 传递给 std::async
使用 std::future 和 std::async 的依赖求解器