`
abs200311235
  • 浏览: 122778 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

从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        p(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)
分享到:
评论

相关推荐

    osapi 跨平台系统API封装 for C

    为跨平台(win32/linux)编程而设计的一套系统API,封装了thread,socket, mutex, semaphore, sharedmemory, int type等接口和类型。开发者使用这套接口来开发C程序时,可以做到在不同的平台上只需要一套代码,可以无视...

    osapi 跨平台系统API封装 for C++

    为跨平台(win32/linux)编程而设计的一套系统API,封装了thread,socket, mutex, semaphore, sharedmemory, int type等接口和类型。开发者使用这套接口来开发C++程序时,可以做到在不同的平台上只需要一套代码,可以...

    Winsock 完成端口模型封装的全新类

    the need for the Windows threads, thread synchronization, Winsock API and Windows IO mechanism of a certain understanding. If we do not understand, recommended several books : "Inside Windows 2000," ...

    CAPI Voice Phone Thread DLL-开源

    基于AVM CAPI ADK的基于CAPI的语音电话通信DLL(Win32)。 所有CAPI操作都封装在自己的线程中。 功能:多个连接,语音文件发送/接收,线路交叉连接

    VB编程常用的模块及CTL控件集打包.rar

    另外简单的说一下windows下应用程序的内存管理,我也不很懂,呵呵,win32下的应用程序 ‘的内存区域是隔开的,每个程序有自己的一块内存不能直接访问别的程序的内存区,当然,这里调用的几个系统函数有访问别的程序内存...

    mfc教程(word版)

    第2章 MFC和Win32 9 2.1 MFC Object和Windows Object的关系 9 2.2 Windows Object 12 2.2.1 Windows的注册 12 2.2.2 MFC窗口类CWnd 15 2.2.3 在MFC下创建一个窗口对象 17 2.2.4 MFC窗口的使用 18 2.2.5 在MFC下窗口...

    MFC-李进九 电子书籍完整版

    第2章 MFC和Win32 9 2.1 MFC Object和Windows Object的关系 9 2.2 Windows Object 12 2.2.1 Windows的注册 12 2.2.2 MFC窗口类CWnd 15 2.2.3 在MFC下创建一个窗口对象 17 2.2.4 MFC窗口的使用 18 2.2.5 在MFC下窗口...

    深入浅出MFC【侯捷】

    第1章 Win32程序基本概念 Win32程序开发流程 需要什么函数库(.LIB) 需要什么头文件(.H) 以消息为基础,以事件驱动之(message based,event driven) 一个具体而微的Win32程序 程序进入点WinMain 窗口类之注册与...

    深入浅出MFC 2e

    类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态成员(变量与函数) C++程序的生与死:兼谈...

    侯捷- -深入浅出MFC

    类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态成员(变量与函数) C++程序的生与死:兼谈...

    ZPublic_Release

    *如果你要修改ZPublic_Release任何代码,或者有什么建议,请提交到*********************************************************/#ZPublic_Releasedesign_pattern设计模式封装thread_sync进程线程同步相关z_lua_bind...

    CreateThread创建多线程与单线程比较

    第二种是启动多线程,不同模式下启动函数不同,mfc与API与WIN32下面注意点也是有区别的! VC启动一个新线程的三种方法,有需要的朋友可以参考下。 第一种AfxBeginThread() 用AfxBeginThread()函数来创建一个新...

    Python核心编程第二版(ok)

     10.3.7 在应用使用我们封装的函数   10.3.8 else子句   10.3.9 finally子句   10.3.10 try-finally语句   10.3.11 try-except-else-finally:厨房一锅端  cccc10.4 上下文管理   10.4.1 with...

    精易模块[源码] V5.15

    12、修复“类_识图-&gt;找图_从字节集”命令,载入大文件直接奔溃的BUG,感谢易友【tone】反馈。 精易模块 V3.80 what’s new:(20140801) 1、新增“进程_取优先级”,特殊进程需要特权,检索指定的进程的优先级。...

    Python核心编程第二版

     10.3.7 在应用使用我们封装的函数   10.3.8 else子句   10.3.9 finally子句   10.3.10 try-finally语句   10.3.11 try-except-else-finally:厨房一锅端  10.4 上下文管理   10.4.1 with语句  ...

    精易官方免费模块v3.60版

    2.增加 DLL "RtlMoveMemory_整数型2",目前应用于 类_位图操作 的 “从屏幕创建” 1.删除 “网页_验证码读取” 该命令是封装的 网页_访问_对象,所以 请直接使用“网页_访问”或“网页_访问_对象”读取验证码,根据...

    在同步代码结束后,使用ReleaseMutex(THandle

    这两个函数的详细情况请看Win32 API联机文档。 4、在同步代码结束后,使用ReleaseMutex(THandle)函数来标志。该函数只是释放互斥对象和线程的拥有者关系,并不释放互斥对象的句柄。 5、调用CloseHandle(THandle...

    Delphi多线程编程之三 同步读写全局数据

    这两个函数的详细情况请看Win32 API联机文档。 4、在同步代码结束后,使用ReleaseMutex(THandle)函数来标志。该函数只是释放互斥对象和线程的拥有者关系,并不释放互斥对象的句柄。 5、调用CloseHandle(THandle...

Global site tag (gtag.js) - Google Analytics