游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2356|回复: 5

[问题]关于多线程

[复制链接]

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-9-22 01:15:00 | 显示全部楼层 |阅读模式
看过一个VB6源码之后产生疑问,一般在VC++上创建一个新线程,是向CreateThread传递一个函数(指针),当该函数返回时,线程就结束,但那个VB6的源码却传递sub,这样写正确吗?

还有就是,如果在VB6中,向CreateThread传递function的话,是不是真的会在该function返回时自动结束线程?

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-9-22 08:13:00 | 显示全部楼层

Re:[问题]关于多线程

以前我贴过个问题,VB6里我用多个TIMER控件来模拟多线程。

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2005-9-22 18:14:00 | 显示全部楼层

Re:[问题]关于多线程

多线程用vb.net的话,创建是非常简单的~

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-9-22 19:58:00 | 显示全部楼层

Re:[问题]关于多线程

先谢谢两位的帮助!

但是,我不是问如何做多线程,也不是问用多线程是否合适……注意不要离题了:)

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 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有自己独立的线程管理方式,如果处理不好,就会发生异常

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
 楼主| 发表于 2005-9-24 01:51:00 | 显示全部楼层

Re:[问题]关于多线程

十分详细呢~~ :)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-27 22:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表