|
|
发表于 2005-9-23 10:58:00
|
显示全部楼层
Re:[问题]关于多线程
Sub和Function是VB特有的,对于底层实现来讲,都是一个函数,只不过Sub不返回值而已,其实Sub也是返回值的,这里就不讨论了
CreateThread的原型是
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
第一个参数和第二个参数一般情况下用不着,设置为0即可
第三个参数lpStartAddress,线程入口函数的指针,在VC下,这个指针的原型是
typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(
LPVOID lpThreadParameter
);
typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
大家不用管这个是怎么一个类型,只要知道线程函数如何定义就可以了
VC下线程函数必须使这个样子的, WINAPI 是一个宏用来表示函数进出栈的方式
DWORD WINAPI ThreadProc(
LPVOID lpParameter
);
我不知道VB下是否必须是这个样子,但是如果不是这个样子的函数,线程在返回的时候可能会出现一些异常
而且这个函数必须是全局函数,不能定义在Class,Form等中
函数在返回的时候,线程返回的值一般情况下就是函数返回的值
第四个参数就是线程函数的参数,也就是
DWORD WINAPI ThreadProc(
LPVOID lpParameter
);
这个函数中的参数,我们在调用CreateThread的时候,第三个参数 lpParameter的值会自动传递到ThreadProc里
第五个参数dwCreationFlags非常重要,他有三个值,STACK_SIZE_PARAM_IS_A_RESERVATION 不是很常用,只有特定的操作系统才支持,不用去管他,我们常常设置的有0和CREATE_SUSPENDED(&H4),0是缺省值,表示在调用CreateThread以后,线程立即启动,马上调用ThreadProc县城函数,CREATE_SUSPENDED表示线程函数是可以控制的,只有调用了ResumeThread函数以后,线程才会启动,同样的可以调用SuspendThread来中止线程函数的运行,要注意的是,ResumeThread和SuspendThread函数只是控制线程计数器,每调用一次ResumeThread函数,计数器加一,每调用一次SuspendThread计数器减一,如果计数器为0,线程停止运行,计数器也不是无限制增加,最大值定义在 MAXIMUM_SUSPEND_COUNT中。关于调用ResumeThread后线程是继续运行还是重新开始运行,我目前还无法确定。
线程的退出可以调用ExitThread来处理,一般说来,线程结束并不意味着线程函数返回,尤其是在有线程同步问题的时候,我们可以调用ExitThread释放资源,将控制权交给其他线程。总之也就是说,线程函数返回线程结束,线程结束线程函数并不一定返回(我们可以调用ExitThread结束线程但不返回函数)。
最后一个参数lpThreadId是一个返回值,是这个线程的编号,有了这个ID,我们可以通过OpenThread函数来重新取得线程的句柄。
VB下使用线程是比较危险的,因为VB下的函数基本上是线程安全的,但VB的控件基本上都不是线程安全的,COM有自己独立的线程管理方式,如果处理不好,就会发生异常 |
|