前言:
最近项目使用vs2010 还没有 std::thread
到 vs2013 才有集成的 std::thread 吧
用了一下 win32API 创建了一个简单的线程
这里简单写个demo 介绍一下 也当做一个笔记
下面的不管 我没有调用
这个就是他的参数 咱们挨个介绍一下
第一个参数是安全属性,一般设为null,使用缺省的安全属性。当我们想此线程有另外的子进程时,可改变它的属性。
第二个参数是线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线程与创建的线程一样长度的堆栈。并且其长度会根据需要自动变长。
第三个参数,也是最重要的一个,是一个指向函数名的指针,或者函数名字
第四个参数是你需要向线程函数传递的参数,一般是一个指向结构的指针。不需传递参数时,则这个参数设为null。
第五个参数,传入与线程有关的一些标志,如果是CREATE_SUSPENDED,则创建一个挂起的线程,即这个线程本身已创建,它的堆栈也已创建。但这个线程不会被分配给CPU时间,只有当ResumeThread函数被调用后才能执行;当然,也可以调用SuspendThread函数再次挂起线程。要是标志为0,那么一旦建立线程,线程函数就被立即调用。一般传为0即可。 ----第六个参数是系统分配给这个线程的唯一的ID标志
ok 这里来看一个小demo
咱们开启一个线程 然后传递个参数 设置线程5秒超时
#include <windows.h>
#include <iostream>
/// 参数结构体
struct param
{
int a;
int b;
}m_param;
/// 线程函数
DWORD WINAPI Fun1(LPVOID p)
{
///把参数强转为 咱们的结构体指针
param *t = (param*)p;
int i = 0;
while(i++ <3)
{
std::cout << "Fun 1 a:" <<t->a <<",b:"<< t->b << std::endl;
Sleep(1000);
}
}
int main()
{
/// 结构体赋值
m_param.a = 10;
m_param.b = 5;
HANDLE handle = ::CreateThread(NULL,
0,
Fun1, ///线程函数
&m_param, ///参数的地址
0,
NULL
);
/// 等待5秒 否则认为超时
/// WaitForSingleObject 会阻塞 主进程
if(WAIT_OBJECT_0 == WaitForSingleObject(handle,5000))
{
std::cout << "thread run done" <<std::endl;
// 关闭线程
CloseHandle(handle);
}
else
{
std::cout << "thread run timeout~" <<std::endl;
CloseHandle(handle);
}
}
WaitForSingleObject 这个函数是阻塞主线程的 要注意
WaitForSingleObject 的返回值有以下三种情况:
WAIT_OBJECT_0:表示你等待的对象(比如线程、互斥体)已的正常执行完成或完成释放。
WAIT_TIMEOUT:表示你等待的对象在还没完成之前,由 WaitForSingleObject 设置的时间已经超时。
WAIT_ABANDONED:这是针对等待对象是互斥体的情况,当互斥体对象虽然没有被占用它的线程释放,但是占用它的线程已提前中止时,WaitForSingleObject 就返回此值
我们判断最好用 WAIT_OBJECT_0 代表正常执行退出