Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将char[N]参数传递给线程_C++_Multithreading - Fatal编程技术网

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:见答案中的附录。