前几天在学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)
分享到:
相关推荐
为跨平台(win32/linux)编程而设计的一套系统API,封装了thread,socket, mutex, semaphore, sharedmemory, int type等接口和类型。开发者使用这套接口来开发C程序时,可以做到在不同的平台上只需要一套代码,可以无视...
为跨平台(win32/linux)编程而设计的一套系统API,封装了thread,socket, mutex, semaphore, sharedmemory, int type等接口和类型。开发者使用这套接口来开发C++程序时,可以做到在不同的平台上只需要一套代码,可以...
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," ...
基于AVM CAPI ADK的基于CAPI的语音电话通信DLL(Win32)。 所有CAPI操作都封装在自己的线程中。 功能:多个连接,语音文件发送/接收,线路交叉连接
另外简单的说一下windows下应用程序的内存管理,我也不很懂,呵呵,win32下的应用程序 ‘的内存区域是隔开的,每个程序有自己的一块内存不能直接访问别的程序的内存区,当然,这里调用的几个系统函数有访问别的程序内存...
第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下窗口...
第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下窗口...
第1章 Win32程序基本概念 Win32程序开发流程 需要什么函数库(.LIB) 需要什么头文件(.H) 以消息为基础,以事件驱动之(message based,event driven) 一个具体而微的Win32程序 程序进入点WinMain 窗口类之注册与...
类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态成员(变量与函数) C++程序的生与死:兼谈...
类及其成员——谈封装(encapsulation) 基类与派生类:谈继承(Inheritance) this指针 虚拟函数与多态(Polymorphism) 类与对象大解剖 Object slicing与虚拟函数 静态成员(变量与函数) C++程序的生与死:兼谈...
*如果你要修改ZPublic_Release任何代码,或者有什么建议,请提交到*********************************************************/#ZPublic_Releasedesign_pattern设计模式封装thread_sync进程线程同步相关z_lua_bind...
第二种是启动多线程,不同模式下启动函数不同,mfc与API与WIN32下面注意点也是有区别的! VC启动一个新线程的三种方法,有需要的朋友可以参考下。 第一种AfxBeginThread() 用AfxBeginThread()函数来创建一个新...
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...
12、修复“类_识图->找图_从字节集”命令,载入大文件直接奔溃的BUG,感谢易友【tone】反馈。 精易模块 V3.80 what’s new:(20140801) 1、新增“进程_取优先级”,特殊进程需要特权,检索指定的进程的优先级。...
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语句 ...
2.增加 DLL "RtlMoveMemory_整数型2",目前应用于 类_位图操作 的 “从屏幕创建” 1.删除 “网页_验证码读取” 该命令是封装的 网页_访问_对象,所以 请直接使用“网页_访问”或“网页_访问_对象”读取验证码,根据...
这两个函数的详细情况请看Win32 API联机文档。 4、在同步代码结束后,使用ReleaseMutex(THandle)函数来标志。该函数只是释放互斥对象和线程的拥有者关系,并不释放互斥对象的句柄。 5、调用CloseHandle(THandle...
这两个函数的详细情况请看Win32 API联机文档。 4、在同步代码结束后,使用ReleaseMutex(THandle)函数来标志。该函数只是释放互斥对象和线程的拥有者关系,并不释放互斥对象的句柄。 5、调用CloseHandle(THandle...