从Win32 API封装Thread类

前几天在学Windows多线程程序设计,发现Win32 API用起来确实不怎么方便,特别是对于C++程序员。于是实现了一个简单的封装,技术含量当然不高,不过用起来还是比较方便的。如果你熟悉Java,你会发现这个实现有点像Java的Thread,在Java中有两种方法可以创建一个Thread:
1.从Thread类继承并实现run方法:
1 class MyThread extends Thread {
2 public void run() {
3 ...
4 }
5 };
7 //开启线程
8 MyThread thread = new MyThread;
9 thread.start();
2.声明一个类实现Runnable接口并实现run方法:
1 class MyRunnable implements Runnable {
2 public void run() {
3 ...
4 }
5 };
7 // 开启线程
8 MyThread thread = new MyThread(new MyRunnable);
9 thread.start();
具体实现
Java的实现方式还算优雅,我们也可以在C++中模拟,由于篇幅所限,在这里我们只关注基本功能的实现:
thread.h
1 #ifndef THREAD_H
2 #define THREAD_H
4 #include <windows.h>
6 #define CLASS_UNCOPYABLE(classname) \
7 private: \
8 classname##(const classname##&); \
9 classname##& operator=(const classname##&);
11 struct Runnable {
12 virtual void run() = 0;
13 virtual ~Runnable() {}
14 };
16 class Thread : public Runnable {
17 CLASS_UNCOPYABLE(Thread)
在上一篇中介绍了创建Thread的两种方法:从Thread类继承或者实现Runnable接口。有时候这并不是特别方便,我们需要的是更灵活的方法,比如像boost库中的Thread一样可以用普通函数和函数对象
(functor and function object)作为构造函数参数。如果你熟悉STL,你应该熟悉bind1st和bind2nd这两个函数配接器(function adapter),bind1st和bind2nd可以将一个二元函数(binary function)转换成一元函数(unary function)。为了使Thread类能够用普通函数和函数对象作为参数,我们需要一个bind将一元函数转换成无参函数:
bind.h
1 #ifndef BIND_H
2 #define BIND_H
3
4 template <class _Result>
5 struct trivial_function {
6 typedef _Result result_type;
7 };

9 template <class _Operation>
10 class binder : public trivial_function<typename _Operation::result_type> {
11 public:
12 binder(const _Operation &x, const typename _Operation::argument_type &y)
13 :op(x), value(y) {}
14 typename _Operation::result_type operator()() const {
15 return op(value);
16 }
17 protected:
18 _Operation op;
19 typename _Operation::argument_type value;
20 };
21
22 template <class _Operation, class _Tp>
23 inline binder<_Operation>
24 bind(const _Operation& __fn, const _Tp& __x)
25 {
26 typedef typename _Operation::argument_type _Arg_type;
27 return binder<_Operation>(__fn, _Arg_type(__x));
28 }
29
30 #endif/*BIND_H*/
有了bind我们还需要修改Thread类的构造函数,显然我们必须将构造函数声明为成员模板(还有一种方法也可以达到同样的目的,就是把Thread类声明为模板,但是这样的设计好像不太好),这样才能够让Thread类的构造函数可以接受各种类型的参数,修改后的构造函数应该能够使用如下三种类型的参数:
1.Runnable *
2.no argument function
3.no argument functor
下面是修改后的头文件:
runnable.h
http://msnpiki.msnfanatic.com/index.php/Main_Page-->
文章出处:DIY部落(http://www.diybl.com/course/3_program/c++/cppjs/2007114/83725.html)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值