天天看点

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