我有一个声明为
的变量char myvariable[N] = "blablabla"
我需要将它传递给一个帖子
DWORD MyThread(LPVOID lpdwParam)
我试图在线程函数内部转换char *中的lpdwParam,但它不起作用。我该如何解决?
编辑1
这里是代码的完整部分
char myvariable[16];
GetDlgItemTextA(hDlg, IDC_IPADDRESS, &myvariable[0], 16);
myThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThread, (LPVOID)&myvariable, 0, &myThreadId);
DWORD MyThread(LPVOID lpdwParam)
{
char *myvariable2 = (char *)lpdwParam;
....
}
编辑2
不起作用意味着myvariable2不包含myvariable
的文本编辑3
char *myvariable = new char[16];
GetDlgItemTextA(hDlg, IDC_IPADDRESS, myvariable, 16);
myThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MyThread, (LPVOID)myvariable, 0, &myThreadId);
和线程函数:
char *myvariable2 = (char *)lpdwParam;
答案 0 :(得分:6)
如果您正在做这样的事情:
// ...
char myvariable[N] = "blablabla";
HANDLE hThread=CreateThread(NULL, 0, MyThread, (LPVOID)myvariable, 0); // however you should use beginthread to avoid troubles with the CRT
// ...
DWORD MyThread(LPVOID lpdwParam)
{
char * mystring = (char *)lpdwParam;
// ...
return 0;
}
并且你没有通过阅读mystring
得到正确的字符,我的猜测是,在堆栈上分配myvariable
,它会在MyThread
获得机会之前超出范围要运行,因此当您返回指向局部变量的指针时会遇到同样的问题。
解决方案是动态分配你的字符串:
// ...
char * myvariable = new char[N];
*myvariable=0;
strncat(myvariable, "blablabla", N); // this is equivalent to what the nonstandard strlcpy would do
HANDLE hThread=CreateThread(NULL, 0, MyThread, (LPVOID)myvariable, 0); // however you should use beginthread to avoid troubles with the CRT
// ...
DWORD MyThread(LPVOID lpdwParam)
{
char * mystring = (char *)lpdwParam;
// ...
// when you're done with mystring, remember to free it; even better, use a smart pointer
delete [] mystring;
// ...
return 0;
}
顺便提一下,请注意,正如在片段中已经说过的那样,如果您计划在新创建的线程中使用CRT函数,则不应该直接使用CreateThread
,而应该使用{{1 } / _beginthread
函数,因为否则某些CRT每线程结构可能无法正确初始化。
我编辑了我的代码以使用新的char [16],但它不起作用。当我将变量从LPVOID转换为线程函数内的char *时,我只得到奇怪的符号
如果您更改了代码以使myvariable现在成为指针,那么您应该从_beginthreadex
的调用中移除&
; CreateThread
与数组一起使用时是多余的(在这种情况下只使用它的名称就够了),但是现在&
是一个指针它是完全错误的,因为在{{1}上使用它}将提供myvariable
的地址,而不是myvariable
中存储的地址。
长话短说,删掉那个&符号。
答案 1 :(得分:1)
如果您正在进行c ++投射,则需要使用const char* var = reinterpret_cast<const char*>(lpdwParam);
。但要小心,如果它是一个堆栈字符串,它可能会在线程使用它之前超出范围,如果它是一个静态字符串,你应该使用const
来防止任何意外覆盖数据