C++ MFC:使用对象时获取访问冲突错误';工作线程中的成员函数

C++ MFC:使用对象时获取访问冲突错误';工作线程中的成员函数,c++,multithreading,visual-c++,mfc,C++,Multithreading,Visual C++,Mfc,我正在将一个MFC应用程序从WindowsXP迁移到Windows7,在完成这项工作时遇到了一个很大的障碍 以这个代码段为例(m\u CDATA Base是CDATA Base对象的包装类): 代码在主线程中运行,但如果在工作线程中运行,则会引发访问冲突异常。工作线程是使用Windows线程API(带句柄的API)创建的,但是我看到一些代码使用MFC线程API(带Afxbeginthread的API,等等)。Windows线程API是否有可能将其丢弃?我应该尝试使用MFC框架吗?作为一般规则,从

我正在将一个MFC应用程序从WindowsXP迁移到Windows7,在完成这项工作时遇到了一个很大的障碍

以这个代码段为例(m\u CDATA Base是CDATA Base对象的包装类):


代码在主线程中运行,但如果在工作线程中运行,则会引发访问冲突异常。工作线程是使用Windows线程API(带句柄的API)创建的,但是我看到一些代码使用MFC线程API(带Afxbeginthread的API,等等)。Windows线程API是否有可能将其丢弃?我应该尝试使用MFC框架吗?

作为一般规则,从MFC类派生的对象(让我们称这些MFC对象)只能从创建它们的线程访问;这是因为许多MFC对象是底层对象(例如,大多数
CWnd
派生内容)的薄包装,内部数据存储在特定于线程的映射中

如果不知道
m\u cDatabase
代表什么,就很难知道它是否属于上面描述的对象类别,但考虑到您正在崩溃,我认为它是

你有几个选择。最简单的两个可能是:

  • 您可以在线程本身中创建
    m\u cDatabase
    ,并使用它。您需要传递构造它所需的所有参数。您还需要对线程使用的任何其他MFC对象实例执行相同的操作
  • 您可以查看
    m\u cDatabase
    所属的类是否提供了检索线程安全的底层句柄的方法。如果是这样,您可以将句柄传递给线程,然后线程可以直接访问句柄,或者如果类提供类似
    FromHandle
    的方法,则可以在句柄周围构建MFC包装器
    你的代码有错误。不管你使用哪种API,它们都会在那里。是的,我刚刚试过使用MFCAPI。还是没有骰子。看来我得想办法破解这个问题了。如果你需要从另一个线程访问MFC对象,你必须使用
    AfxBeginThread
    生成工作线程,否则MFC的多线程支持将无法正确初始化。谢谢你的帮助,尼克!不幸的是,该类没有传递线程安全句柄的方法,因此我可能会使用类似于#1的东西。
    MyApp* pApp = (MyApp*)AfxGetApp();
    pApp->m_cDatabase.CloseDatabase();