如何使用一个 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 的 thread:id?