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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章