C++ 将char[N]参数传递给线程
我有一个变量声明为C++ 将char[N]参数传递给线程,c++,multithreading,C++,Multithreading,我有一个变量声明为 char myvariable[N] = "blablabla" 我需要把它传给一根线 DWORD MyThread(LPVOID lpdwParam) 我试图在线程函数中强制转换char*中的lpdwParam,但它不起作用。我怎样才能修好它 编辑1 这里是代码的完整部分 char myvariable[16]; GetDlgItemTextA(hDlg, IDC_IPADDRESS, &myvariable[0], 16); myThreadHandle
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;
如果你正在做这样的事情:
// ...
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
,而应使用\u beginthread
/\u beginthreadex
函数,因为否则,某些CRT每线程结构可能无法正确初始化
补遗
我编辑代码以使用新字符[16],但它不起作用。当我在线程函数中将变量从LPVOID转换为char*时,我只得到奇怪的符号 如果更改了代码,使myvariable现在成为指针,则应该从对
CreateThread
的调用中删除&
&
在与数组一起使用时是多余的(在这种情况下,仅使用其名称就足够了),但现在myvariable
是指针,这显然是错误的,因为在myvariable
上使用它将提供myvariable
的地址,而不是myvariable
中存储的地址
长短,删除那个密码。< /P> < P>如果你做C++的转换,你需要使用<代码> const char * var = RealTypReST(LPDWPARAM);代码>。不过要小心,如果它是堆栈字符串,它可能会在线程使用它之前超出范围,如果它是静态字符串,您应该使用
const
来防止任何意外的数据覆盖您所说的“它不工作”是什么意思?我相信现在不再是这种情况了。“_beginthread和_beginthreadex类似于Win32 API中的CreateThread函数,但有以下区别:-它们初始化某些C运行时库变量。只有在线程中使用C运行时库时,这才重要。”该文档涉及VS2010,所以我想它仍然适用。@Stefano:你的编辑证实了我的猜测。试着按照我的答案中给出的建议去做。我编辑了我的代码以使用新字符[16],但它不起作用。当我将变量从LPVOID转换为线程函数中的char*时,我只会感到奇怪symbols@Stefano:见答案中的附录。