c++ win32API 【CreateThread】创建线程

前言:

最近项目使用vs2010 还没有 std::thread
到 vs2013 才有集成的 std::thread 吧

用了一下 win32API 创建了一个简单的线程
这里简单写个demo 介绍一下 也当做一个笔记

c++ win32API 【CreateThread】创建线程_第1张图片
下面的不管 我没有调用
c++ win32API 【CreateThread】创建线程_第2张图片

c++ win32API 【CreateThread】创建线程_第3张图片

这个就是他的参数 咱们挨个介绍一下

第一个参数是安全属性,一般设为null,使用缺省的安全属性。当我们想此线程有另外的子进程时,可改变它的属性。
第二个参数是线程堆栈尺寸,一般设为0,表示与此应用的堆栈尺寸相同,即主线程与创建的线程一样长度的堆栈。并且其长度会根据需要自动变长。
第三个参数,也是最重要的一个,是一个指向函数名的指针,或者函数名字
第四个参数是你需要向线程函数传递的参数,一般是一个指向结构的指针。不需传递参数时,则这个参数设为null。
第五个参数,传入与线程有关的一些标志,如果是CREATE_SUSPENDED,则创建一个挂起的线程,即这个线程本身已创建,它的堆栈也已创建。但这个线程不会被分配给CPU时间,只有当ResumeThread函数被调用后才能执行;当然,也可以调用SuspendThread函数再次挂起线程。要是标志为0,那么一旦建立线程,线程函数就被立即调用。一般传为0即可。 ----第六个参数是系统分配给这个线程的唯一的ID标志

ok 这里来看一个小demo

咱们开启一个线程 然后传递个参数 设置线程5秒超时

#include 
#include 
/// 参数结构体
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 代表正常执行退出

c++ win32API 【CreateThread】创建线程_第4张图片

你可能感兴趣的:(c/c++)