2011-06-27 67 views
1
#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <iostream.h> 
#include <string.h> 

    void Thread1(LPVOID param) 
    { 
     int a; 
     a = *((int *)param); 
     for (int i= 0; i <10; i++) 
     printf("%d\n", a); 
    } 

    int main() 
    { 
     int a =4; 
     int ThreadId; 
     CreateThread(0, 0x0100, Thread1, &a, 0, &ThreadId); 

     for(int i = 0; i <11; i++) 
      Sleep(1); 

     return(1); 
    } 

這是一個簡單的代碼,但我無法弄清楚,爲什麼Visual Studio是給我的錯誤:的CreateThread()錯誤

錯誤C2664:「的CreateThread」:無法從「無效轉換參數3 (void *)'改爲'unsigned long(__stdcall *)(void *)' 這個名稱範圍內的函數都不匹配目標類型 執行cl.exe時出錯。

+1

你可以改變'Thread1'的聲明爲'unsigned long __stdcall Thread1(LPVOID param)'嗎? (並返回一個整數?) –

+0

是的,我改變了這一點,我得到的結果:但是爲什麼我需要unsigned long或DWORD在這種情況下開始:當我聲明它爲「void WINAPI Thread1(LPVOID param)「 –

回答

3

定義如下

DWORD WINAPI MyThreadProc(LPVOID lpParameter) 

的CreateThread()要求__stdcall調用約定。

+1

是的,我改變了這一點,我得到的結果:但是爲什麼我要求unsigned long或DWORD在這種情況下:當我聲明它爲」void WINAPI Thread1(LPVOID param)「 –

+0

大學生真的嗎?似乎LPTHREAD_START_ROUTINE被定義爲我所說的。 http://msdn.microsoft.com/en-us/library/aa964928.aspx – mattn

+0

也將您的線程函數強制轉換爲(LPTHREAD_START_ROUTINE) – Pramod