//在A.h我有以下代码
使用命名空间系统;
使用msclr :: auto_gcroot;
命名空间A
{
公众参考A级
{
公共:
virtual bool Func();
A();
〜A();
虚拟布尔Connect();
保护:
DWORD WINAPI threadConnect(void * pParam);
};
公共课AHelper
{
公开:
auto_gcroot A;
};
}
//在A.cpp我有以下代码
//这是主要的DLL文件。
命名空间A
{
A :: A()
{
m_FuncHandle = mpsNil;
}
A ::〜A()
{
}
bool A :: Func()
{
return true;
}
bool A :: Connect()
{
AHelper * AHelper;
m_retVal = false;
AHelper = new AHelper();
AHelper-> A = this;
HANDLE Handle_Of_Thread = 0;
DWORD dwThreadId;
// DWORD WINAPI threadConnect(void * pParam);
//如果我在这里声明了函数声明,我正在
//错误LNK2001:未解析的外部符号" unsigned long __stdcall threadConnect(void *)" (?threadConnect @@ @ YGKPAX Z)
Handle_Of_Thread = CreateThread (NULL,0,threadConnect,AHelper,0,& dwThreadId); //使用此代码我正在
//错误C3867:' A :: A :: threadConnect':函数调用缺少参数列表;使用'& A :: A :: threadConnect'创建指向成员的指针
返回m_retVal;
}
DWORD WINAPI A :: threadConnect(void * pParam)
{
AHelper * AHelper = reinterpret_cast(pParam);
//我需要调用Func
返回0;
}
}
答案 0 :(得分:1)
通常的技巧是有一个静态函数,它接受某种类型的id,这个函数确定调用哪个someFunc()(因为每个对象都有自己的someFunc,你显然需要知道哪一个)要么使用a通过直接传递对象的地址来查找,或者在C / C ++应用程序中很常见。
所以你有类似的东西:
static bool thread_func(object o)
{
return o->someFunc();
}
诀窍是静态函数必须是可重入的,因此线程不会干扰任何状态(如果确实如此,请确保其线程安全)
所有这些都假设您正在调用未在线程内创建的对象上的方法。如果您只是调用一个函数并且已经在线程中创建了对象,那么只需调用该函数!