2013-04-11 83 views
0

//在啊,我有以下代碼如何從一個線程訪問非靜態方法在C++

包括「afxwin.h」

包括「msclr \ auto_gcroot.h」

使用命名空間System;

使用msclr :: auto_gcroot;

命名空間甲

{

公共引用類甲

{

公共:

虛擬BOOL Func鍵();

A();

〜A();

virtual bool Connect();

保護:

DWORD WINAPI threadConnect(無效* pParam);

};

公共類AHelper

{

公共:

auto_gcroot A;

};

}

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

//這是主要的DLL文件。

包括 「stdafx.h中」

包括 「啊」

包括 「弦」

包括 「sstream」

包括 「stdlib.h中」

包括「 strsafe.h「

include」windows.h「

包括「tchar。H」

命名空間甲

{

A :: A()

{

m_FuncHandle = mpsNil;

}

A ::〜甲()

{

}

布爾A :: Func鍵()

{

返回真;

}

布爾A ::連接()

{

AHelper * AHelper;

m_retVal = false;

AHelper = new AHelper();

AHelper-> A = this;

HANDLE Handle_Of_Thread = 0;

DWORD dwThreadId;

// DWORD WINAPI threadConnect(void * pParam);

//如果我在這裏聲明函數聲明我正在

//錯誤LNK2001:無法解析的外部符號 「無符號長__stdcall threadConnect(無效*)」 (?threadConnect @@ @ YGKPAX Z)

Handle_Of_Thread =的CreateThread (NULL,0,threadConnect,AHelper,0,& dwThreadId); //使用此代碼我得到

//錯誤C3867:'A :: A :: threadConnect':函數調用缺少參數列表;使用'& A :: A :: threadConnect'創建指向成員的指針

return m_retVal;

}

DWORD WINAPI A :: threadConnect(無效* pParam)

{

AHelper * AHelper =的reinterpret_cast(pParam);

//這裏我需要調用Func

return 0;

}

}

+1

什麼是'ref'的東西?它當然不是標準的C++。另外,你可以在線程中調用你喜歡的任何函數,一般來說C++沒有限制。 – PlasmaHH 2013-04-11 18:42:15

回答

1

通常的竅門是具有靜態函數,它接受某種類型的ID,該函數確定someFunc()調用哪個(如每個對象將具有其自己的someFunc,你顯然需要知道哪一個),或者使用查找,或者在C/C++應用程序中通用,直接傳遞對象的地址。

讓你有這樣的:

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

的訣竅是靜態函數必須是可重入,所以不保持國家本身的線程干擾(或者,如果是這樣,請確保它的線程安全)

這一切都假設你在一個沒有在線程內創建的對象上調用方法。如果你只是調用一個函數,並且你的線程已經創建了該對象,就調用該函數!

相關問題