`
hulianwang2014
  • 浏览: 681366 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

教你用Windows API 写一个Thread类(不使用static哦)------(1)

 
阅读更多

关于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指针,也就是说下面的代码:

class	CBase{
public:
	void	Hello();
};

void CBase::Hello(){
	cout<<"Hello,World!"<<endl;
}

int main(){
	CBase	base;
	base.Hello();
}

这个CBase::Hello()实现上在会被编译编译成语意等价的CBase::Hello(CBase* this);当然,不同的编译器会有不同的处理方式,比如GCC和VS对这个Hello的处理方式是不同的(但是,在语意上是等价的)。

但是,这里只是说明了原理,原理的东西是为了便于理解,但是,难以转化成真正的代码,真正的code还关系到更多的细节,为了便 于大家理解,我将会在下一节中说明VS平台对于this指针的处理方式。

分享到:
评论

相关推荐

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    而要成功编译ExoSIP,似乎许多人被难住了,直接在XP-sp2上,用VC6,虽然你使用了eXoSIP推荐的winsock2.h,但是会得到一个 sockaddr_storage结构不能识别的错误,因为vc6自带的开发库太古董了...

    detour 2.1

    ---- (3) 可以使用VirtualAllocEx从一个进程为另一正运行的进程分配虚存,再使用 QueryProtectEx函数把页面的权限更改为可读可写可执行,并把要执行的指令以二进制机器码的形式写入,从而为一个正在运行的进程注入...

    侯捷- -深入浅出MFC

    产生一个Worker Thread 产生一个UI Thread 线程的结束 线程与同步控制 MFC多线程程序例程 第15章 定制一个AppWizard 到底Wizard是什么? Custom AppWizard的基本操作 剖析AppWizard Components Dialog Templates和...

    TaskManager

    利用业余时间,写了个貌似windows自带的任务管理器(私下认为其功能更甚windows自带的)。 封装了许多API接口成为类(一些源自网络,一些自己封装),方便C++使用。但是对整个代码的设计比较烂,打算在学完设计模式...

    Java精华(免费版)

    设想一下,你有一个简单的程序,用来提示用户输入一个URL,然后通过这个URL去下载一个网页。如果用户输入的URL有错误,构建器就会抛出一个exception。既然这个exception是checked exception,你的程序就可以捕获它...

    C#浏览器编程,学习使用

    3) 例如,当用户用鼠标点击一个超链的起点时,控制程序就调用一个客户从所需文档所在的远地服务器上取回该文档,并调用解释程序向用户显示该文档 4) HTML 解释程序是必不可少的,而其他的解释程序则是可选的。 5) ...

    Tricks of the Windows video Game Programming---part1

    Tricks of the Windows video Game Programming &lt;br&gt;PART I Windows Programming Foundations 7 1 Journey into the Abyss 9 A Little History.............................................................

    Visual.C#.编程精彩百例

    实例41 线程Thread Relative Static跟踪与实现 实例42 线程池(ThreadPool)的应用 实例43 多线程互斥运行 实例44 多线程时钟应用程序 实例45 监视多线程 实例46 防止多线程应用程序死锁 实例47 文件同步操作...

    Java测试题2答案

    定义一个类名为"MyClass.java"的类,并且该类可被一个工程中的所有类访问,那么该类的正确声明应为:CD A double a=1.0; A private class MyClass extends Object B class MyClass extends Object C ...

    Java邮件开发Fundamentals of the JavaMail API

    javamail-1_2.zip file, and add the mail.jar file to your CLASSPATH. The 1.2 implementation comes with an SMTP, IMAP4, and POP3 provider besides the core classes. After installing JavaMail 1.2, ...

    深入浅出MFC【侯捷】

    深入浅出MFC(第二版) 目录 第0章 你一定要知道(导读) 这本书适合谁 你需要什么技术基础 你需要什么软硬件环境 让我们使用同一种语言 本书符号习惯 本书例程的取得 范例程序说明 与前版本之差异 如何联络作者 第...

    深入浅出MFC 2e

    产生一个Worker Thread 产生一个UI Thread 线程的结束 线程与同步控制 MFC多线程程序例程 第15章 定制一个AppWizard 到底Wizard是什么? Custom AppWizard的基本操作 剖析AppWizard Components Dialog Templates和...

    Java2核心技术卷I+卷2:基础知识(第8版) 代码

    Java 核心技术 卷1 Index Chapter 1: An Introduction to Java 1 Java As a Programming Platform 2 The Java “White Paper” Buzzwords 2 Java Applets and the Internet 7 A Short History of Java 9 ...

    VC驿站基础班无KEY高清C++教程下载地址

    ①、VC中常用控件的用法讲解见:http://www.cctry.com/thread-106-1-1.html ②、VS2008中新增控件的用法讲解。 6、定时器讲解 ①、定时器相关函数讲解:SetTimer、OnTimer、KillTimer; ②、利用定时器实现动态...

    《Visual.C#.编程精彩百例》配套光盘part1

    实例52 在C#中快速调用Windows API 实例53 摄氏温度与华氏温度间相互转换(1) 实例54 摄氏温度与华氏温度间相互转换(2) 实例55 使用FileSystemWatcher组件监视Web服务器 实例56 由颜色名字...

    《Visual.C#.编程精彩百例》配套光盘.part2

    实例52 在C#中快速调用Windows API 实例53 摄氏温度与华氏温度间相互转换(1) 实例54 摄氏温度与华氏温度间相互转换(2) 实例55 使用FileSystemWatcher组件监视Web服务器 实例56 由颜色名字...

    微软内部资料-SQL性能优化2

    Module Overview 1 Lesson 1: Memory 3 Lesson 2: I/O 73 Lesson 3: CPU 111 Module 3: Troubleshooting Server Performance Module Overview Troubleshooting server performance-based support ...

    cuda检测工具 devicequery.exe

    CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "GeForce GTX 650" CUDA Driver Version / Runtime Version 9.1 / 8.0 CUDA Capability Major...

    cuda检测工具 devicequery.zip(不含源代码,源代码在cuda sdk 8.0里)

    CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "GeForce GTX 760" CUDA Driver Version / Runtime Version 9.2 / 8.0 CUDA Capability Major...

    【VS2010 C# 代码】实时监听鼠标位置

    //调用下一个钩子 [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, IntPtr wParam, IntPtr ...

Global site tag (gtag.js) - Google Analytics