多线程

windows下创建多线程:

 一个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <windows.h> //需要含该头文件
#include <iostream>
 
 
//winodws下多线程函数原型必需如下声明
//DWORD unsigned long
//WINAPI _stdcall
//函数名可以用任何合法名称替换
//LPVOID void *
DWORD WINAPI ThreadProc(LPVOID lpParamter);
 
int main()
{//多线程例子
    //win线程创建函数
    HANDLE hThrdPrc = CreateThread(NULL, //安全性 NULL为默认
        0, //初始栈的大小, 设为0或小于默认提交大小, 就会使用同调用函数的线程相同的栈空间大小.
        ThreadProc,//线程地址
        NULL, //线程接受的参数
        0, //附加标记, CREATE_SUSPENDED: 创建线程后要手动调用ResumeThread启动线程, 0为自动启动
        NULL/*一个结构体, 用来接收线程ID, 可为NULL*/);
    CloseHandle(hThrdPrc); //关闭句柄, 线程已启动, 表示对这个线程句柄没兴趣作别的事情
 
    std::cout<<"this is in main!\n";
 
    std::cin.get();
    return 0;
}
 
DWORD WINAPI ThreadProc(LPVOID lpParamter)
{
    std::cout<<"Thread in ThreadProc not in main\n";
    return 0;
}

这是一个带有返回值, 和传递多个参数的例子:

思路是把所有需要的参数和返回值封装到一个结构中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <windows.h>
#include <iostream>
 
 
DWORD WINAPI ThreadProc(LPVOID lpParamter);
 
typedef struct
{//将多个参数和返回值放到结构中
    int a;
    int b;
    int sum;
    bool isOk; //判断线程是否完成
} Addtor, * PTRADD;
 
int main()
{
    Addtor adder;
    adder.a = 10;
    adder.b = 20;
    adder.isOk = false;
 
    HANDLE hThrdPrc = CreateThread(NULL,
        0,
        ThreadProc,
        (LPVOID)(&adder), //将结构体指针传递给线程
        0,
        NULL);
    CloseHandle(hThrdPrc);
 
    while(!adder.isOk) {} //等待线程结果
 
    std::cout<<"Sum = "<<adder.sum<<std::endl;
    std::cout<<"done in main!\n";
 
    std::cin.get();
    return 0;
}
 
DWORD WINAPI ThreadProc(LPVOID lpParamter)
{
    PTRADD pa = (PTRADD)lpParamter;
    pa->sum = pa->a + pa->b;
    pa->isOk = true;
    return 0;
}

多线程

上一篇:自定义微信图文模板注意事项整理


下一篇:CC254x的微信AirSync调试笔记