2014-09-04 113 views
0

我試圖用CreateThread()函數創建一個簡單的程序。我需要將LPSTR參數傳遞給struct pDataArray中的新線程函數。我遵循MSDN的例子(MSDN CreateThread() Example)。C++ CreateThread()LPSTR參數錯誤Windows 7(64)

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

主要功能(CreateNewThread)接收LPSTR command變量與例如文本「喜所有」從另一功能並且能夠正常運行並正確引入到該結構,但是當我嘗試將其發送到所述螺紋函數(MyThreadFunction)它返回一個很多奇怪caracters的,存儲器轉儲我supose:

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變量發送到線程函數的正確方法是什麼?

感謝您的建議。

+0

爲什麼是這個標籤C#例如,如果你做這樣的事情有可能發生? – crashmstr 2014-09-04 18:16:25

+0

標籤已刪除,對不起:D – Ikary 2014-09-04 18:34:38

回答

3

看來你正在傳遞一個臨時的LPSTRCreateNewThread(),所以在執行MyThreadFunction()時它已經被刪除了。

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

或類似這樣的:

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

你是個天才! ;)我從套接字獲取字符串。線程啓動時,套接字的函數將重置全部,包括LPSTR變量。非常感謝! – Ikary 2014-09-04 18:43:08