2013-05-07 46 views
0

我試圖讓這個結構進入我的線程,但是我得到了垃圾。Win32api傳遞struct來創建線程

結構我使用:

typedef struct { 
    HWND hWnd; 
    int cntrlid; 
    TCHAR text[BUFF]; 
}parametros; 
在信息交換,我必須控制按鈕女巫的情況下

開始線程:

case IDC_TAB_A: 
     threaddata.hWnd=hWnd; 
     threaddata.cntrlid=IDC_TAB_A; 
     _tcscpy(threaddata.text, _T("Carregou A")); 
     hThreadsender=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadSenderProc, (LPVOID) &threaddata, 0, NULL); 

     break; 

和處理線程我得到了功能:

DWORD WINAPI ThreadSenderProc(LPVOID param){ 

    parametros temp=*((parametros *)param); 
    EnviaLetra(temp.hWnd, temp.text,temp.cntrlid); 

    return 0; 
} 

東西一定是錯的,但我不能得到它是什麼,任何人都可以幫忙嗎?

在此先感謝! (對不起英文不好)

+0

我唯一的問題是,我沒有看到明顯的錯誤,我使用的結構被破壞。 – 2013-05-07 23:59:03

+0

寫入斷點可能會顯示值爲何意外改變。 – 2013-05-08 00:14:11

回答

2

你的結構在線程可以訪問它之前被銷燬。可以使用事件進行同步,也可以動態分配結構。 PS:刪除那個可怕的(LPTHREAD_START_ROUTINE)演員。如果你正確地聲明你的功能,你將不需要它。除非你確切地知道你在做什麼以及爲什麼,否則函數指針將被禁止。 哦,而且(LPVOID)劇組也是無用的。

+0

它的複製粘貼:P這是一個單一的作業,所以我只是複製類的例子,去mallock結構和檢查會發生什麼 感謝您的答案 – 2013-05-07 18:36:58

+0

上帝,隊友,我愛你,我今天愚蠢, 4個番茄醬發生問題後,5後來在這裏我們兔子,謝謝! – 2013-05-07 19:03:40

+0

@RogerMartins請接受答案。 FWIW,使用堆分配是正確的解決方案。使用事件進行同步非常繁重,成本也更高。這是一個糟糕的解決方案。堆分配是要走的路。是的,停止所有那些令人討厭的演員! – 2013-05-07 22:34:51