教你用Windows API 写一个Thread类(不使用static哦)------(1)
来源:互联网 发布:淘宝尾款怎么付 编辑:程序博客网 时间:2024/06/11 07:16
关于Windows API 的线程函数CreateThread的使用MSDN有如下说法:
The CreateThread function creates a thread to execute within the address space of the calling process.
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to security attributes DWORD dwStackSize, // initial thread stack size LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function LPVOID lpParameter, // argument for new thread DWORD dwCreationFlags, // creation flags LPDWORD lpThreadId // pointer to receive thread ID);
关于lpStartAddress这个函数的原型MSDN又有如下说法:
The ThreadProc function is an application-defined function that serves as the starting address for a thread. Specify this address when calling theCreateThread or CreateRemoteThread function. TheLPTHREAD_START_ROUTINE type defines a pointer to this callback function.ThreadProc is a placeholder for the application-defined function name.
DWORD WINAPI ThreadProc( LPVOID lpParameter // thread data);
其最重要的核心意思是说CreateThread是Windows创建线程的方式,并且里面需要一个全局的或者静态的函数做为线程的执行函数(不能为class的非静态成员函数),但是,我们回想一下Java里面的Thread类的使用,你就会发现,Java里面只要实现runable接口,就可以创建线程了,自然地有多态,如果使用全局函数或者static函数,自然失去面向对象的多态性质。
我想,大家看到这里面肯定会问,为什么CreateThread里面不可以使用类的成员函数作为线程函数呢?学过C++的同学都知道,C++的成员函数至少背负了一个this指针,也就是说下面的代码:
classCBase{public:voidHello();};void CBase::Hello(){cout<<"Hello,World!"<<endl;}int main(){CBasebase;base.Hello();}
这个CBase::Hello()实现上在会被编译编译成语意等价的CBase::Hello(CBase* this);当然,不同的编译器会有不同的处理方式,比如GCC和VS对这个Hello的处理方式是不同的(但是,在语意上是等价的)。
但是,这里只是说明了原理,原理的东西是为了便于理解,但是,难以转化成真正的代码,真正的code还关系到更多的细节,为了便 于大家理解,我将会在下一节中说明VS平台对于this指针的处理方式。
- 教你用Windows API 写一个Thread类(不使用static哦)------(1)
- 教你用Windows API 写一个Thread类(不使用static哦)------(2)
- 教你用Windows API 写一个Thread类(不使用static哦)------(3)
- 教你用Windows API 写一个Thread类(不使用static哦)------(4)
- 使用API写Windows程序 (转)
- 使用API写Windows程序
- 用VS2010写了一个串口示例程序(使用API写的)----lindabell@欧海
- 产品经理教你写代码—用JAVA写一个阿里云VPC Open API调用程序
- 用API写windows程序
- 用windows api写对话框
- C++ 使用API写Windows程序
- C++ 使用API写Windows程序
- c++在调用类的时候不一定非得实例化对象哦,有时候你不写系统会为你默认生成一个临时实例对象哦~
- 如果你能用C#写一个分布式ORM,让你用Java可以写出同样的DORM不?
- 多线程实现方式1:自定义一个类,继承Thread类,并重写run方法。
- 手把手教你写windows BAT
- 从Win32 API封装Thread类[1]
- 从Win32 API封装Thread类[1]
- 程序员新年要做的10个决定
- nagios安装遇到的问题及解决
- 浅析GCC下C++多重继承 & 虚拟继承的对象内存布局
- Recordset.Open参数说明
- R-2.15.1 在 fedora16 上的安装(Can't find X11 headers and libs)
- 教你用Windows API 写一个Thread类(不使用static哦)------(1)
- 跟我一起学习C++虚函数--第一篇
- Nagios监控项目配置
- 非缓存 重定向到文件(未验证,仅作标记)
- 跟我一起学习C++虚函数--第二篇
- 跟我一起学习C++虚函数--第三篇
- 两位企业经营实践大师干了什么
- oracle 函数大全 之 substr
- 双线DNS解析