如何从C ++中的线程访问非静态方法

时间:2013-04-11 18:37:54

标签: methods c++-cli

//在A.h我有以下代码

包括" afxwin.h"

包括" msclr \ auto_gcroot.h"

使用命名空间系统;

使用msclr :: auto_gcroot;

命名空间A

{

公众参考A级

{

公共:

virtual bool Func();

A();

〜A();

虚拟布尔Connect();

保护:

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()

{

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;

}

}

1 个答案:

答案 0 :(得分:1)

通常的技巧是有一个静态函数,它接受某种类型的id,这个函数确定调用哪个someFunc()(因为每个对象都有自己的someFunc,你显然需要知道哪一个)要么使用a通过直接传递对象的地址来查找,或者在C / C ++应用程序中很常见。

所以你有类似的东西:

static bool thread_func(object o)
{
    return o->someFunc();
}

诀窍是静态函数必须是可重入的,因此线程不会干扰任何状态(如果确实如此,请确保其线程安全)

所有这些都假设您正在调用未在线程内创建的对象上的方法。如果您只是调用一个函数并且已经在线程中创建了对象,那么只需调用该函数!