我有一个课我想从.net打电话。我把这个类装饰成'ref'。我有一个非静态方法'someFunc',我打算用Thread调用它。
//在A.h我有以下代码
include "afxwin.h"
include "msclr\auto_gcroot.h"
using namespace System;
using msclr::auto_gcroot;
namespace A
{
public ref class A
{
public:
virtual bool Func();
A();
~A();
virtual bool Connect();
protected:
DWORD WINAPI threadConnect(void* pParam);
};
public class AHelper
{
public:
auto_gcroot A;
};
}
在A.cpp中,我有以下代码
// This is the main DLL file.
include "stdafx.h"
include "A.h"
include "string"
include "sstream"
include "stdlib.h"
include "strsafe.h"
include "windows.h"
include "tchar.h"
namespace 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);
//If I declare the function declaration here I am getting
//error LNK2001: unresolved external symbol "unsigned long __stdcall threadConnect(void *)" (?threadConnect@@YGKPAX@Z)
Handle_Of_Thread = CreateThread (NULL, 0, threadConnect, AHelper, 0, &dwThreadId); // with this code I am getting
//error C3867: 'A::A::threadConnect': function call missing argument list; use '&A::A::threadConnect' to create a pointer to member
return m_retVal;
}
DWORD WINAPI A::threadConnect(void* pParam)
{
AHelper* AHelper = reinterpret_cast(pParam);
//Here I need to call Func
return 0;
}
}
答案 0 :(得分:0)
使用托管thread而不是非托管版本来调用托管类型上的方法。
gcnew Thread(gcnew ThreadStart(this, &A::threadConnect));
并更改方法声明以匹配托管线程的预期签名。
void A::threadConnect()
{
// No need for AHelper. The thread that's running will have a reference to
// the 'this' object, so no need for a GCRoot to keep it alive.
}