2013-05-07 61 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