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

Posted

技术标签:

【中文标题】如何使用一个 std::thread 对象来运行 2 个顺序事件(函数)?【英文标题】:How can I use one std::thread object to run 2 sequential events (functions)? 【发布时间】:2019-06-19 02:01:49 【问题描述】:

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

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

CMyProgressBar has a member m_thDownload.

void CMyProgressBar::DoDataExchange(CDataExchange* pDX)

    m_thDownload = std::thread(funDownload);

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

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

【问题讨论】:

为什么不在函数中按顺序排列代码? void runThread() download(); install(); ? 【参考方案1】:

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

void funDownloadAndInstall() 
    funDownload();
    funInstall();


m_thDownload = std::thread(funDownloadAndInstall);

您也可以使用 lambda 表达式:

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

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

【讨论】:

你是对的。 DoDataExchange 被调用两次。在创建和OnOK对话框中。最好让它成为一个有控制权的新成员或者OnInitDialog

以上是关于如何使用一个 std::thread 对象来运行 2 个顺序事件(函数)?的主要内容,如果未能解决你的问题,请参考以下文章

分离的 std::thread 终止后是不是需要删除?

在运行之前获取 std::thread 的 thread:id?

如何安全地删除 ATL DLL 中的 std::thread

如何使用 std::thread?

如何放弃或取消 std::thread

std::thread 线程在对象中分离,它何时终止?