c++ - 如何使用一个 std::thread 对象来运行 2 个顺序事件(函数)?

标签 c++ multithreading c++11 mfc

我的项目是一个 MFC 对话框。有一个“安装”按钮。用户可以点击该按钮开始下载,下载完成后自动执行安装。

enter image description here

我已经在 std::thread 中完成了下载部分。当用户点击“安装”按钮时,它会提示一个进度条,它实际上是另一个CDailog——它叫做CMyProgressBar。

CMyProgressBar has a member m_thDownload.

void CMyProgressBar::DoDataExchange(CDataExchange* pDX)
{
    m_thDownload = std::thread(funDownload);
}

这里 m_thDownload 可以做下载的事情。下载后,我需要一个线程来执行安装。我不想再添加一个线程成员,按逻辑其实我也不必再添加一个线程。

那么,我应该把开始安装代码放在哪里呢?下载后可以立即执行吗?

最佳答案

创建一个运行这两个函数的函数,然后在一个线程中运行那个函数。

void funDownloadAndInstall() {
    funDownload();
    funInstall();
}

m_thDownload = std::thread(funDownloadAndInstall);

您还可以使用 lambda 表达式:

m_thDownload = std::thread([]() {
    funDownload();
    funInstall();
});

此外,我对 MFC 不是很熟悉,但是 DoDataExchange 似乎是启动线程的错误位置。如果它被调用不止一次,或者根本没有调用怎么办?

关于c++ - 如何使用一个 std::thread 对象来运行 2 个顺序事件(函数)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56659115/

相关文章:

c++ - 如何读取 C++ 中的重音字符并将它们与 isalnum 一起使用?

java - 程序运行速度很慢,忽略Thread.sleep

c++ - 同时使用 std::regex,定义的行为?

c++ - 在 C++11 中按值捕获成员变量的好方法是什么?

c++ - 在 linux 中,如何判断我是链接到静态库还是动态库?

c++ - fmt 库 - 格式化为(编译时)string_view

java - 多线程 Java TCP 客户端

c++ - C/C++ 中大型非稀疏非方矩阵的多线程乘法

c++ - 如何将从模板参数派生的编译时信息添加到模板?

c++ - 关于复制构造函数和 NRVO