//在A.h中,我有以下代码
包含"afxwin.h“
包含"msclr\auto_gcroot.h“
使用命名空间系统;
使用msclr::auto_gcroot;
命名空间A
{
公共引用A类
{
公共:
virtual bool Func();
A();
~A();
虚拟布尔连接();
受保护:
DWORD WINAPI threadConnect(void* pParam);
};
公共类AHelper
{
公共:
auto_gcroot A;
};
}
//在A.cpp中,我有以下代码
//这是主DLL文件。
包含"stdafx.h“
包含"A.h“
包括“字符串”
包括"sstream“
包含"stdlib.h“
包含"strsafe.h“
包含"windows.h“
包含"tchar.h“
命名空间A
{
A::A()
{
m_FuncHandle = mpsNil;
}
A::~A()
{
}
bool A::Func()
{
返回true;
}
布尔A::Connect()
{
AHelper* AHelper;
m_retVal = false;
AHelper =新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;
}
}
发布于 2013-04-12 02:49:27
通常的技巧是有一个接受某种id的静态函数,这个函数决定调用哪个someFunc() (因为每个对象都有自己的someFunc,您显然需要知道是哪个),要么使用查找,要么像C/C++应用程序中常见的那样,直接传递对象的地址。
所以你有类似这样的东西:
static bool thread_func(object o)
{
return o->someFunc();
}诀窍在于,静态函数必须是可重入的,因此不会保持线程本身的状态以进行干扰(或者,如果有,请确保其线程安全)。
这一切都假设您正在调用一个不是在线程中创建的对象上的方法。如果你只是在调用一个函数,并且你已经在你的线程中创建了对象,那就调用这个函数吧!
https://stackoverflow.com/questions/15956313
复制相似问题