1

我有一门课,我想从.net 调用。我将班级装饰为“参考”。我有一个非静态方法“someFunc”,我打算使用 Thread 调用它。

//在啊我有以下代码

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;   
    }



}
4

1 回答 1

0

使用托管线程而不是非托管线程来调用托管类型的方法。

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.
}
于 2013-04-12T21:21:14.130 回答