本来说想发个多线程的应用来着,没意思了。。。。
回过头来看以前写的那几个介绍多线程APi的文章也有偏颇。。。。
寒 。。。
-==============================-
对于用 VB 做多线程,个人认为还是免了吧,真的是有点做无畏的强求,我研究VB实现多线程的时间不少了
至今只得说一句,实在是太不方便了,究其原因个人认为还是因为他不是真正意义上的完全编译,在我看来
VB 编译的程序应该是,以真正的 Exe 文件为壳,内部应该是以半解释半实编译的方式执行的,所以特别是
遇到对象操作(个人认为VB的对象操作几乎完全是解释执行的)时不仅VB会崩溃,连 Coder 都会崩溃。。。
-==============================-
今天写这个文章,我也会带来新东西,将我所知道的所掌握的操作多线程的方法和大家分享之。。。
其次我也说说怎样绕过多线程,实现另外一种可以虚拟多线程执行方式的方法。
先说多线程:
方法 1 : CreateThread
不用多说,万变不离其宗,这是 Win32 内创建线程的唯一系统方法,以下介绍的多线程创建方式虽然不直
接接触这个 Win32 APi,但系统也是通过他创建的。
(WinNT 下: CreateThread > CreateRemoteThread > ZwCreateThread > Ring0:xx)
方法 2 : TimerSetEvent
这个函数是 Win32 系统的一个高精度计时器函数,通过调用这个函数,系统会创建一个新的线程,让Timer
回调函数中的代码运行在这个新线程中。
方法 3 : SHCreateThread
很多人应该没见过这个函数,这是 shlwapi.dll 的一个导出函数,这个函数看字面也能理解是个创建多线
程的函数,而且。。。 他是基于对象操作的多线程函数,也就是说他能够稳定的运行一些用上面2种方法创
建,但不能稳定运行的代码。至少这个函数在 IDE 的环境下表现的中规中矩! 使用方法可查 API-GUIDE
方法 4 : CreateRemoteThread
WinNT 下,由 CreateThread 调用此函数之后进入 ntdll 的 ZwCreateThread 然后调用进Ring0层进入核心调用
做为一种线程的创建方法,还是希望能够熟悉一下,如果不用VB写代码,要写跨进程线程,这是一个简单易
行的办法,否则只能继续SetWindowHook了,熟悉汇编指令的还可以远程分配内存写硬编码执行
方法 5 : 简单说下 ActiveX 方式的多线程
论坛里面有用这种方法实现的稳定多线程,代码虽好,但我却不会用,在倡导绿色软件的今天,为了一个多线
程,而注册表里面又要多点xx,不好。。而且卸载麻烦。 用 ActiveX 创建线程与其他方式创建的线程最重
要的地方要主义,任何VB函数的调用最好都建立在新线程中新初始化的对象基础上执行,不要跨对象调用,
而 ActiveX 的安全线程本身也正是利用了这点,不知道研究 ActiveX 的老大们有没注意,利用他特性实
现的多线程,是初始化的一个新的线程,而这个线程中初始化的对象则是整个工程。很大的资源浪费,而且有
时候还不好控制,不是你想要的效果。总之一句话,新线程中要自己初始化新的对象而且最好不要用实例继承
方法 6 : 我的想法
1. COPY 线程 TLS 组: 在多线程初始化时COPY主线程TLS组的所有项目值,至新线程TLS
2. 在主线程中,调整对象线程模式为多线程模式,用错误的调用方法实现
方法 7 : 异步
论坛中很多人问,timer控件的事件中代码是怎么运行的。其实这就是异步,对于单核CPU多线程的执行方式
与异步简直无异。而最重要的是,VB 中用异步实现代码执行是安全的。其实异步从大家开始Win GUI编程时
就开始接触了。例如窗体的消息循环中就经常会以异步的方式执行,1个消息正在执行的时候,另外的消息又
被执行了,也许这样说会觉得有些乱,稍侯解释。这个帖子内容要说的内容就完了,下一个帖子里面有个我
忘了什么时候写的代码,以那个代码为例,介绍应用异步。