将char [N] param传递给线程

时间:2010-12-28 11:02:34

标签: c++ multithreading

我有一个声明为

的变量
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;

2 个答案:

答案 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来防止任何意外覆盖数据