0

//在啊我有以下代码

包括“afxwin.h”

包括“msclr\auto_gcroot.h”

使用命名空间系统;

使用 msclr::auto_gcroot;

命名空间 A

{

公共参考 A 类

{

上市:

虚拟布尔函数();

一个();

〜A();

虚拟布尔连接();

受保护:

DWORD WINAPI threadConnect(void* pParam);

};

公开课 AHelper

{

上市:

auto_gcroot A;

};

}

//在A.cpp我有下面的代码

// 这是主 DLL 文件。

包括“stdafx.h”

包括“啊”

包括“字符串”

包括“流”

包括“stdlib.h”

包括“strsafe.h”

包括“windows.h”

包括“tchar.h”

命名空间 A

{

A::A()

{

m_FuncHandle = mpsNil;

}

A::~A()

{

}

布尔 A::Func()

{

返回真;

}

布尔 A::Connect()

{

AHelper* AHelper;

m_retVal = 假;

AHelper = 新的 AHelper();

AHelper->A = 这个;

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); // 有了这段代码,我得到了

//error C3867: 'A::A::threadConnect': 函数调用缺少参数列表;使用 '&A::A::threadConnect' 创建指向成员的指针

返回 m_retVal;

}

DWORD WINAPI A::threadConnect(void* pParam)

{

AHelper* AHelper = reinterpret_cast(pParam);

//这里需要调用Func

返回0;

}

}

4

1 回答 1

1

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

所以你有类似的东西:

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

诀窍是静态函数必须是可重入的,因此它本身不保留任何状态以供线程干扰(或者如果确实如此,请确保其线程安全)

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

于 2013-04-11T18:49:27.497 回答