VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 36822|回复: 56

封装了一个VB创建多线程的API函数(标准DLL),欢迎试用、测试、提意见!

  [复制链接]
 楼主| 发表于 2011-11-21 13:35:44 | 显示全部楼层 |阅读模式
本帖最后由 tgy 于 2011-11-21 23:07 编辑

终于写好了VB创建线程的DLL函数(标准动态链接库,此DLL也是VB写的),API申明使用
功能:创建线程。
特点:可替代API CreateThread来创建线程,且自动对线程进行初始化,线程函数中不再需要初始化线程就可以使用对象、类、窗口等。提供多达四个线程参数,如果不够用的可通过结构体扩展,通过API声明使用,大大简化代码。使用很方便,特别是对于初学者。
注意:请将程序设为从sub main()启动,否则会重复调用启动窗口。和其它多线程一样,不能在IDE环境调试,只能编译EXE后再调试。
文件名:VBCreateThread.dll
函数名:CreateThreadE
参数(共五个):
address  线程函数地址  long型
p0至p3 为线程参数 long型
返回值:线程句柄 long型


VB申明及参数示例:
Public Declare Function CreateThreadE Lib "VBCreateThread.dll" (ByVal address As Long, ByVal p0 As Long, ByVal p1 As Long, ByVal p2 As Long, ByVal p3 As Long) As Long

详见附件使用示例源码。
VBCreateThread.rar (12.38 KB, 下载次数: 1519)

评分

参与人数 3威望 +21 人气 +5 收起 理由
77577 + 1 + 1 很想看看你发的那个VB注射器是怎么写的,我
snyga + 10 + 2 非常给力!dll能开源就好了
shamying + 10 + 2 赞一个!当然要加分了。

查看全部评分

本帖被以下淘专辑推荐:

 楼主| 发表于 2011-11-30 20:36:53 | 显示全部楼层
本帖最后由 tgy 于 2011-11-30 22:18 编辑

最后更新(1.3.0):
增加通过对象和函数名调用线程函数的API使用方式,即线程函数可写在窗体中,并声明为公有函数,即可通过窗体对象和线程函数名来创建线程,API方式也可以不用写线程函数到标准模块中了,但此法只能传一个线程参数,需多参数可通过结构体解决。
函数名:CreateThreadEByTGY
参数:
1. obj 线程函数所在的对象 如窗体  类型:对象
2.funname为线程函数名称 类型:字符串
3.p1为线程参数 类型:长整型
声明示例:
Public Declare Function CreateThreadEByTGY Lib "VBCreateThread.dll" (ByRef obj As Object, ByVal funname As String, ByVal p1 As Long) As Long
返回值:线程句柄 long型

调用示例.rar (23.21 KB, 下载次数: 1338)
回复 支持 1 反对 0

使用道具 举报

发表于 2011-11-21 14:44:39 | 显示全部楼层
不错,遗憾的是不支持MDI结构

点评

……理解错题意了  发表于 2011-11-21 21:46
tgy
如果要显示非模态,可能要自己处理消息循环  发表于 2011-11-21 17:30
tgy
不要在线程函数中show MDI窗体  发表于 2011-11-21 16:19
只要把p0-p3都改成ByRef As Any就完了  发表于 2011-11-21 15:07
回复 支持 反对

使用道具 举报

发表于 2011-11-21 15:26:07 | 显示全部楼层
本帖最后由 hpygzhx520 于 2011-11-21 15:31 编辑

创建线程的代码放在MDI里面,线程中显示的窗体不能是子窗体
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-21 16:14:47 | 显示全部楼层
本帖最后由 tgy 于 2011-11-21 16:16 编辑
hpygzhx520 发表于 2011-11-21 15:26
创建线程的代码放在MDI里面,线程中显示的窗体不能是子窗体


对,不要在线程函数中show MDI子窗体,因为MDI窗体是一系列有联系的窗体,如果在其它线程中启动会打断这种联系.但可以在窗体内部使用多线程
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-21 21:47:21 | 显示全部楼层
本帖最后由 tgy 于 2011-11-21 22:25 编辑
hpygzhx520 发表于 2011-11-21 14:44
不错,遗憾的是不支持MDI结构


可以使用普通窗体通过setparent来模拟MDI子窗体,凑合使用。呵呵
试试这个:
mdi.rar (26.94 KB, 下载次数: 803)

点评

tgy
也许子类化能解决问题,如果能把现存的真正MDI窗口的窗口消息处理过程复制过来使用。不过有点复杂。  发表于 2011-11-22 23:03
馊主意:用单线程回调,要显示窗体的时候子线程SendMessage给主窗体,主窗体子类化一下,这样就能确保线程切换了  发表于 2011-11-22 13:59
回复 支持 反对

使用道具 举报

发表于 2011-11-21 22:19:51 | 显示全部楼层
支持一个不错。
回复 支持 反对

使用道具 举报

发表于 2011-11-22 11:00:49 | 显示全部楼层
不错,顶一下
回复 支持 反对

使用道具 举报

发表于 2011-11-22 15:44:01 | 显示全部楼层
总体算不错的了。好玩的是,点击常规子窗体,主窗体得到焦点,点击这个线程里面创建的窗口,主窗体失去焦点……,这种窗体也不在窗体集合中

点评

tgy
窗体集合只对当前线程有效!  发表于 2011-12-17 22:03
tgy
所以我说凑合用下,用来做个工具窗口什么的还是满的,可以把标题栏去掉.  发表于 2011-11-22 16:28
tgy
用setparent就只能这样了,且这个常规窗口还不会随主窗口变化而变化(最大化时),且还有个标题栏.呵呵  发表于 2011-11-22 16:26
回复 支持 反对

使用道具 举报

发表于 2011-11-22 22:22:47 | 显示全部楼层
太棒了,这个程序。对那个dll的源码有点感兴趣了。

点评

我补上链接吧http://www.vbgood.com/thread-107399-1-1.html  发表于 2011-11-22 23:12
tgy
核心源码就是我的“*再谈VB多线程和标准DLL问题* ”中的源码。所以封装的dll大小就是20几K。呵呵  发表于 2011-11-22 22:44
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-23 10:41:50 | 显示全部楼层
本帖最后由 tgy 于 2011-11-23 13:51 编辑

这个可以在线程函数中显示非模式窗口,但窗口关闭时必须手动退出线程.这个DLL只是测试一下可以显示非模式窗口.不建议使用.
必须在窗口的Form_Terminate 事件中执行ExitThread 0才能退出线程.
可以在新的线程中显示多个非模式窗口了,但在关闭窗口时要注意检查是不是最后一个窗口才退出线程.
VBCreateThread.rar (13.43 KB, 下载次数: 816)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2020-4-6 13:02

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表