使用Windows API实现自定义线程类CThread

我们在使用QThread的时候,只需要继承QThread重新实现 run() 函数就可以了,使用起来很方便,接下来就介绍一种实现自定义的类 CThread ,只要继承 CThread 后,重新实现 run() 函数即可。
关于 QThread 的使用可以参见 使用Qt中的QThread创建线程

本篇文章完整代码下载:
https://github.com/douzhongqiang/threadCode/tree/master/CThread


首先看一下继承 CThread 的子类,CalcSumThread (主要实现计算前100个数的和)的实现:
头文件定义:

run 函数中的实现:

调用部分:

运行结果:
Created Thread Success, Id is 22200
Current Thread ID is 22200, Result is 5050

函数 start() 表示开启线程(激活线程为可执行状态)
函数 wait() 表示阻塞等待线程退出(同 std::thread 的 join函数)


那么这个 CThread 到底时怎么实现的呢?
下面是 CThread 的完整实现:
头文件定义:

源文件:

本质上是使用了一个静态函数作为线程的入口函数,将 this 指针作为函数的参数传入。如果不是静态函数,c++本质上会把非静态函数默认传递一个 this 指针作为参数,不符合线程入口函数的函数指针类型定义,因此此处必须为静态函数。

  • Create() 函数中,使用 CreateThread 函数创建线程,关于 CreateThread 这个API的使用可以参见 使用Qt中的QThread创建线程

    这里使用参数 CREATE_SUSPENDED 表示,表示创建线程后不立即执行,挂起该线程。

  • start() 函数,启动线程;使用函数 ResumeThread() 表示将线程从挂起状态变为激活状态,操作系统有一个线程挂起参数,当该参数为0时,线程变为激活状态。使用函数 SuspendThread() 是将该参数+1,使用函数 ResumeThread() 是将该参数-1 。
  • threadProc() ,线程入口函数,将参数转为 this ,然后调用虚函数 run()
  • wait() 函数,阻塞等待线程执行完成。使用 WaitForSingleObject() 这个Windows API 实现。

You May Also Like

About the Author: admin

喜欢编程、爱游戏,更爱生活。

发表评论

电子邮件地址不会被公开。