【发布时间】:2018-07-13 13:56:05
【问题描述】:
我有一个 CDialog,它允许用户在硬盘中导航、列出和显示文件预览。在某些情况下,可能会有很多繁重的文件,这些情况需要很长时间,因此我们将加载操作移到了单独的线程中。
现在,我希望在单独的线程中移动磁盘访问可以让我正常使用 CDialog,但这不会发生,因此我无法滚动或移动窗口。
我是否在此过程中遗漏了什么?代码如下:
void CMyDialog::LoadFiles()
{
// …
std::thread load_file(LoadingRoutine, reinterpret_cast<void *>(&data));
load_file.detach();
// same happens if I use Afx functions
// AfxBeginThread(&CMyDialog::LoadingRoutine, reinterpret_cast<void *>(&data));
// …
}
【问题讨论】:
-
这还不足以确定问题所在。当您闯入调试器时,代码挂在哪里?你能提供一个minimal reproducible example吗?
-
代码没有挂起:在线程完成工作之前我无法使用对话框。
-
似乎“数据”是一种共享资源,并在对话框的其他地方使用。使用 std::promise 和 std::future 获取线程的状态。如果未来还没有准备好,请向对话框发出信号以打印其他消息并继续。
-
我错过了什么是的!正如 IInspectable 所说,我们需要一个 minimal reproducible example - 我们可以自己检查、编译、运行和测试的东西。
标签: c++ multithreading mfc