2013-04-12 66 views
1

我有一个我想从.net调用的类。我把课堂装饰成'ref'。我有一个非静态方法'someFunc',我打算使用Thread来调用。如何从C++中的线程访问非静态方法使用ref类

//在啊,我有以下代码

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 *)" ([email protected]@[email protected]) 

     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

ref class表示它是C++/CLI –

+0

ref class是托管类,相当于Csharp中的类。 – user2271083

+0

[C++/cli传递(托管)委托给非托管代码的可能的重复](http://stackoverflow.com/questions/2972452/c-cli-pass-managed-delegate-to-unmanaged-code) –

回答

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. 
} 
相关问题