天天看點

Win32多線程程式設計(一)

我們在進行win32控制台程式調試的時候也經常會用到多線程,

這裡簡單的用一個例子來給初學者說明多線程程式設計,由此開啟

多線程的程式設計學習,僅抛磚引玉而已,在程式設計的過程中深入。

1、建立win32控制台工程

2、建立c++檔案并添加到工程

3、包含頭檔案

#include <windows.h>

#include <stdio.h>

4、設定工程

Project -> Settings -> C/C++ -> Category ->

Code Generation -> User run-time library ->

Debug Multithreaded

5、實作多線程函數

DWORD WINAPI ThreadProc1(LPVOID lpParam){

    printf(“線程開始\n”);

    while(1){

        //doing someting 

    }

    printf(“線程結束\n”);

    return 0;

}

6、實作main函數

void main(){

    HANDLE thread_handle;

    DWORD thread_ID;

    thread_handle = CreateThread(                   //建立線程

                                NULL,

                                0,

                                (LPTHREAD_START_ROUTINE) ThreadProc1,

                                NULL,

                                0,

                                & thread_ID

                                );

    if(!thread_handle)

        printf("線程建立失敗\n");

    WaitForSingleObject(thread_handle,INFINITE);    //等待線程執行完成

    CloseHandle(thread_handle);                     //關閉線程

}

7、線程參數傳遞

       如果線程函數需要使用參數,可以使用全部變量,線上程函數中通路全局變量,

這樣最好将全局變量聲明為static;也可以在建立線程的時候将參數作為結構傳給

CreateThread函數的第4個參數,然後線上程函數中解析出需要的變量。

       定義參數結構體:

       Struct FuncPars{

              int id;

              char *name;

       };

       定義參數結構體變量:

       FuncPars pars;

       pars.id = 0x01;

       pars.name = ”thread1”;

       傳遞參數結構體指針:

    thread_handle = CreateThread(

                                NULL,

                                0,

                                (LPTHREAD_START_ROUTINE) ThreadProc1,

                                &pars,

                                0,

                                &thread_ID

                                );

    線程函數中解析參數:

    DWORD WINAPI ThreadProc1(LPVOID lpParam){

        int id;

        char *name;

        id = (FuncPars *)lpParam->id;

        name = (FuncPars *)lpParam->name;

        printf(“線程開始\n”);

        while(1){

            //doing someting 

        }

        printf(“線程結束\n”);

        return 0;

   }

相關函數原型以及參數定義請參考MSDN