我正在尝试使用CreateThread()函数创建一个简单的程序。我需要将LPSTR参数传递给struct pDataArray中的新线程函数。我遵循MSDN(MSDN CreateThread() Example)的示例。

typedef struct MyData {
LPSTR val1;
int val2;
} MYDATA, *PMYDATA;


主函数(CreateNewThread)从另一个函数接收带有示例文本“ hi all”的LPSTR command变量,并且可以正常工作并将其正确引入结构中,但是当我尝试将其发送到线程函数(MyThreadFunction)时,它将返回一个很多奇怪的角色,我认为是内存转储:

DEBUG: Inside CreateThread string: hi all
DEBUG: Before send to function: hi all
DEBUG: Inside MyThreadFunction data: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠☻☻☻☻WinSock 2.0


CreateThread函数的代码为:

int CreateNewThread(LPSTR command, int numThread)
{
    printf("\nDEBUG: Inside CreateThread string: %s\n",command);
    PMYDATA pDataArray[MAX_THREADS];
    DWORD   dwThreadIdArray[MAX_THREADS];
    HANDLE  hThreadArray[MAX_THREADS];

    // Allocate memory for thread data.

    pDataArray[numThread] = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
            sizeof(MYDATA));

    if( pDataArray[numThread] == NULL )
    {
        ExitProcess(2);
    }

    // Generate unique data for each thread to work with.

    pDataArray[numThread]->val1 = command;
    pDataArray[numThread]->val2 = 100;

    printf("\nDEBUG: Before send to function: %s\n",pDataArray[numThread]->val1);

    // Create the thread to begin execution on its own.

    hThreadArray[numThread] = CreateThread(
        NULL,                           // default security attributes
        0,                              // use default stack size
        MyThreadFunction,               // thread function name
        pDataArray[numThread],          // argument to thread function
        0,                              // use default creation flags
        &dwThreadIdArray[numThread]);   // returns the thread identifier


    if (hThreadArray[numThread] == NULL)
    {
       ErrorHandler(TEXT("CreateThread"));
       ExitProcess(3);
    }
    return 0;
}


MyThreadFunction()的代码是:

DWORD WINAPI MyThreadFunction( LPVOID lpParam ){

PMYDATA pDataArray;
pDataArray = (PMYDATA)lpParam;
LPSTR data = pDataArray->val1;
printf("\nDEBUG: Inside MyThreadFunction data: %s\n",data);
return 1;

}


有人可以告诉我将LPSTR变量发送到线程函数的正确方法是什么吗?

感谢您的建议。

最佳答案

似乎您正在将临时LPSTR传递给CreateNewThread(),因此在执行MyThreadFunction()时,它已被删除。例如,如果您执行以下操作,则可能会发生这种情况:

CreateNewThread(std::string("hi all").c_str(), 0);


或像这样:

std::string f() { return "hi all"; }
CreateNewThread(f().c_str(), 0);

10-08 11:51