【问题标题】:MFC: Stop a thread from deleting the input pointer to its ControllingFunctionMFC:停止线程删除指向其 ControllingFunction 的输入指针
【发布时间】:2014-12-19 11:22:38
【问题描述】:

我有一个线程定义为:

m_DoIt_Thread=AfxBeginThread(DoIt_ThreadProc, (LPVOID)this, 0, 0, CREATE_SUSPENDED);

DoIt_ThreadProcm 定义为:

UINT CMyClass ::DoIt_ThreadProc(LPVOID pData)
{
    CMyClass * self = (CMyClass *)pData;
    self->DoIt();
    return 0;
}

显然 pData 在线程完成后被销毁。有没有办法阻止这种情况,以免指针被破坏?我们可以为 mfc 线程定义/覆盖析构函数吗?

这是从我之前的question 分支出来的。另外我觉得这个论坛post也有联系。

【问题讨论】:

  • 你确定第一个代码中的this 存在足够长的时间吗?没有什么会在你的第二秒内摧毁pData(除非DoIt 这样做),你可能没有朝着正确的方向寻找。

标签: c++ multithreading mfc


【解决方案1】:

pData 在线程结束时被销毁。它被线程函数视为指向 void 的指针,您可以将其转换为您需要/应该将数据传递给线程的任何内容。但是线程不会对pData指向的内存做任何事情,也不会对这个内存中的对象做任何事情。

实际上它可以做的唯一一件事就是释放内存(使用delete),但这假设内存是使用new 分配的,这个假设可能是错误的。幸运的是 MFC 没有做这个假设,也没有释放内存。

析构函数调用是完全不可能的,因为没有信息pData 指向什么对象——它是void*。并且没有调用析构函数。您的问题一定是由其他原因引起的。

【讨论】:

  • 我明白了,好点子。现在只是想知道...m_bAutoDelete = false 的目的是为了保留已完成线程的指针和句柄吗?总的来说,没有类似于线程解构器的概念吗?
  • m_bAutoDeleteCWinThread 类的成员,它是线程的 MFC 包装器。它控制CWinThread对象的生命周期,与pData无关。
  • 是的,事实上我确实发现了我的代码的问题。这是因为消息泵一直忙于等待任务,因此无法响应。所以这个新问题与上面回答的问题相关,但并不完全相关。
猜你喜欢
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多