2012-11-08 102 views
1

我目前正在開發一個項目,我必須爲C++ dll構建一個shell,因此新的C#GUI可以使用它的函數。 但是我得到了以下問題,在C++部分,我必須爲特定原因創建一個新線程,並且我想將一個int數組傳遞給新線程。 請注意,在發生這種情況的函數中分配給數組的值是從代碼的C#部分獲得的。將指針數組作爲void指針傳遞給C++中的新線程

__declspec(dllexport) void CreateReportPane(int &id, int &what) 
{ 
    DWORD threadId; 
    int iArray[2] = { id, what};  

    HANDLE hThread = CreateThread(NULL, 0, CreateReportPaneThread, iArray, 0, &threadId); 
    if (hThread == NULL) 
    {   
     ExitProcess(3); 
    }  
} 

問題出現在新的線程,我可以可靠地讀取前值出數組的,但第二個價值似乎被釋放,這裏是對對方的代碼。

DWORD WINAPI CreateReportPaneThread(LPVOID lparam) 
{ 
    int id, what; 
    id = *((int *)lparam); 
    what = *(((int *)lparam)+1) ; 
    CreateReportPaneOriginal(id, what); 

    return 0; 
} 

是否有任何方法來防止數組中的值在釋放的同時不保留原始線程捕獲? 非常感謝你提前

+0

不要忘記CloseHandle的(hThread),否則你會泄漏句柄和內存。 – SirDarius

+0

我可能會爲此創建一個結構,但如果您想使用數組,爲什麼不在線程中使用數組符號?例如。 'int * iArray =(int *)lparam; int id = iArray [0]; int what = iArray [1];' –

回答

3
int iArray[2] = { id, what};  

HANDLE hThread = CreateThread(...,CreateReportPaneThread, iArray, ...); 

的問題是,iArray是一個局部陣列,這意味着這獲取破壞了功能CreateReportPane()返回時。所以CreateReportPaneThread()所指的不存在。你偶然得到第一個價值。沒有這樣的保證,你會得到第一個價值。

使用動態數組:

int * iArray = new int[2]; 
iArray[0] = id; 
iArray[1] = what; 

HANDLE hThread = CreateThread(...,CreateReportPaneThread, iArray, ...); 

記得寫DEALLOCATE陣列一旦你在CreateReportPaneThread用它做:

DWORD WINAPI CreateReportPaneThread(PVOID *data) 
{ 
    int *array = static_cast<int*>(data); 

    int id = array[0], what = array[1]; 

    delete []array; //MUST DO IT to avoid memory leak! 

    //rest of your code 
} 
+0

啊當然,非常感謝你們,它解決了我的問題! – wyndesmit

+0

@wyndesmit:如果它解決了你的問題,你應該通過點擊*勾號*標記來接受這個答案。 – Nawaz

+0

啊是的,我還是新來這個界面:) – wyndesmit

2

動態分配陣列,以防止陣列走出去的範圍時CreateReportPane()退出:

int* iArray = new int[2]; 
iArray[0] = id; 
iArray[1] = what;  

否則線程訪問數組是不再有效,這是不確定的行爲。線程程序CreateReportPaneThread()必須然後delete[]陣列時,它不再需要(注意使用delete[]而不是delete)。