gpt4 book ai didi

c++ - 当我的 UI 在 MFC 中获取关闭输入时,如何退出线程

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:51 26 4
gpt4 key购买 nike

我正在用“MFC”制作一些程序。

单击按钮时,消息处理程序会创建新线程进行工作。

在工作中,用户可以按 B 按钮退出应用。

在A按钮创建的线程中,它使用了我创建的C类。

类(class)动态分配一些工作资源。

按下 B 按钮时,我想在我的应用死机之前取消分配资源。

我该怎么做?请帮助!!! :)

void CMyDlg::On_A_BnClicked() {  // do the job button
...
AfxBeginThread(MyThread, (LPVOID)this);
...
}
UINT CMyDlg::MyThread(LPVOID arg) {
...
MyCClass mcc;
for (int i = 0; i < 100; i++) {
...
mcc.init(file_name);
mcc.do_somethin();
mcc.deinit();
...
}
...
}
void CMyDlg::On_B_BnClicked() { // close button
}
void MyCClass::init(file_name) {
mFileClass.Open(file_name, CFile::modeCreate | CFile::modeWrite);
// and so on
...
}

如果用户在 MyThread 中执行“do_somethin”方法时按下 B 按钮。

如何在 MyCClass 对象的 deinit() 方法后退出 MyThread?

我想到了一种方法,在 B 按钮处理程序中创建事件,然后将消息发送到 MyCClass

这样我就可以取消初始化 MyCClass 的消息处理程序中的所有资源。

但是好像不行。 :(

最佳答案

一般机制:您的工作线程 (WT) 应该有一个 protected 数据成员 bool bRunning = true(默认情况下),一个成员函数 Exit() 设置 bRunning = false。 WT 循环定期检查 bRunning 并在 false 时中止。创建 WT 时,保留其句柄(假设为 hWT),并在应用程序退出之前调用 hWT->Exit()

--

在WT退出可能需要很长时间的情况下,增加同步机制。一个例子:

// WT.h

public:

int Run();

void Exit() // ** Assume that only main-thread call this, once. **
{
std::mutex m_dummy_mutex;
std::unique_lock<std::mutex> guard(m_dummy_mutex);

TRACE("WT state switched to not-running.\n");
m_bRunning = false; // <-- (1)

TRACE("Wait for WT stopped notification...\n");
// (It may happen that the receiver wakes up, although no notification happened.)
bool rv = m_stopped.wait_for(guard, std::chrono::seconds(5), // <-- (2)
[this]() {return (m_pResource == nullptr); });
// 'Spurious Wakeup' mitigation with lambda predicate.

#ifdef _DEBUG
if (rv)
TRACE("WT stopped notification - Recieved.\n");
else
TRACE("WT stopped notification - Timeout expired.\n");
#endif
}

protected:

std::condition_variable m_stopped;
bool m_bRunning = true; // Running until Stop().
CResource * m_pResource = nullptr;

在 WT 循环中:

// WT.cpp

int CWT::Run()
{
m_pResource = new CResource; // Let's say CResource is your Resource.

while (m_bRunning)
{
// Do something ... (May take time. Check regularly m_bRunning to abort.)

if (!m_bRunning)
{
delete m_pResource;
m_pResource = nullptr;
m_stopped.notify_one(); // <-- (3)
TRACE("WT stopped. Main-thread notified.\n");
continue;
}
}

return 0;
}
  • 最好不要使用 new/delete,而是使用 C++ 智能指针。

关于c++ - 当我的 UI 在 MFC 中获取关闭输入时,如何退出线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55587274/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com