0

// Ah には次のコードがあります

「afxwin.h」を含める

「msclr\auto_gcroot.h」を含めます

名前空間システムの使用;

msclr::auto_gcroot を使用します。

名前空間 A

{

公開参照クラス A

{

公衆:

仮想ブール Func();

A();

〜A();

仮想ブール接続();

保護:

DWORD WINAPI threadConnect(void* pParam);

};

パブリック クラス AHelper

{

公衆:

auto_gcroot A;

};

}

//A.cppには以下のコードがあります

// これはメインの DLL ファイルです。

「stdafx.h」を含める

「あ」を含む

「文字列」を含める

「sstream」を含める

「stdlib.h」を含める

「strsafe.h」を含める

「windows.h」を含める

「tchar.h」を含める

名前空間 A

{

A::A()

{

m_FuncHandle = mpsNil;

}

A::~A()

{

}

ブールA::関数()

{

true を返します。

}

ブール A::Connect()

{

AHelper* AHelper;

m_retVal = false;

AHelper = 新しい 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 を返します。

}

}

4

1 に答える 1

1

通常のトリックは、ある種の ID を取る静的関数を用意することです。この関数は、呼び出す someFunc() を決定します (各オブジェクトには独自の someFunc があるため、明らかにどれを知る必要があります) ルックアップを使用するか、またはオブジェクトのアドレスを直接渡すことにより、C/C++ アプリで一般的です。

あなたは次のようなものを持っています:

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

秘訣は、静的関数は再入可能でなければならないため、スレッドが干渉する状態自体を保持しないことです (または、干渉する場合は、スレッドセーフであることを確認してください)。

スレッド内で作成されていないオブジェクトでメソッドを呼び出していることを前提としています。関数を呼び出すだけで、スレッド内に既にオブジェクトが作成されている場合は、関数を呼び出すだけです!

于 2013-04-11T18:49:27.497 に答える