VBGood网站全文搜索 Google

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

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
楼主: tgy

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

  [复制链接]
发表于 2011-11-23 12:06:05 | 显示全部楼层
还有请教一个问题,dll注入hook api的话,如果对方的api是多线的比如send recv等,这些该怎么处理?菜鸟学飞的那个中转办法也没用,怎么才能弄线程同步?要创建个临界吗

点评

中转怎么没用?VB不初始化线程也是可以正常运行的,但条件是干掉__vbaSetSystemError 只能用long变量 不能用内置函数或者对象 也就是说全部功能只能用纯API实现  发表于 2011-11-23 13:15
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-23 12:22:06 | 显示全部楼层
本帖最后由 tgy 于 2011-11-23 12:32 编辑
sunshinebean 发表于 2011-11-23 12:06
还有请教一个问题,dll注入hook api的话,如果对方的api是多线的比如send recv等,这些该怎么处理?菜鸟学飞的 ...


个人觉得:
因为VB的控件都不是线程安全的(据说),所以,除非要必须同时访问此控件或对象,不然不要让多线程同时访问控件,因为自己编程来同步线程的话,开销很大,是以牺牲运行速度作为代价的.倒不如让需要访问控件的代码放到一个线程内执行来得高效简洁.
貌似线程之间安全高效的数据交换方法是通过消息、事件、或普通变量(因为我试过,多线程貌似可以不用同步就可以安全访问普通变量).
记住:多线程只有在需要大量运算或运行时间较长时才有使用价值。否则太多的线程只会增加程序复杂度、降低系统效能,每创建一个线程都是要负出代价的,最好能重复使用线程,即工作线程执行完成任务后不要退出线程,让其挂起,当需要建线程时激活并转到指定的线程入口处,这样就不会为新建线程而花费时间和占用资源。

点评

tgy
{:1_1:}  发表于 2011-11-24 20:18
非常感谢  发表于 2011-11-24 20:12
回复 支持 反对

使用道具 举报

发表于 2011-11-23 19:54:43 | 显示全部楼层
goooooood,
是否可以开源?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-24 08:30:30 | 显示全部楼层
本帖最后由 tgy 于 2011-11-24 22:59 编辑

终于可以完美的SHOW非模式窗口了,不用在窗口中手动退出线程了.关闭所有非模式窗口后,自动结束此线程.效果和在sub main()中显示非式窗口一样.
呵呵,终于理解什么是VB的事件驱动了.
(修订版本:1.0.240)
VBCreateThread.rar (16.14 KB, 下载次数: 949)
回复 支持 反对

使用道具 举报

发表于 2011-11-24 10:29:14 | 显示全部楼层
终于理解什么是VB的事件驱动了.
小声的问下,vb的事件驱动是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-24 11:42:02 | 显示全部楼层
本帖最后由 tgy 于 2011-11-24 22:54 编辑
flash 发表于 2011-11-24 10:29
终于理解什么是VB的事件驱动了.
小声的问下,vb的事件驱动是什么?


VB程序(线程任务)执行完后,要进入一个循环中等待事件的发生,事件发生后线程转入事件函数执行,执行完后返回循环中继续等事件的发生,如果没有这个循环来监听事件,代码执行完成就结束程序了(例如一般方法创建的线程显示完非模式窗口后就结束了,所以窗口消失.).所以说VB是通过事件来实现过程之间的跳转,从而完成程序的各种功能的。这就是我理解的消息循环和事件驱动.

评分

参与人数 1威望 +2 人气 +1 收起 理由
flash + 2 + 1 赞一个!

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-25 21:52:21 | 显示全部楼层
本帖最后由 tgy 于 2011-11-25 21:53 编辑

正式版(版本:1.0.282):
VBCreateThread.rar (15.56 KB, 下载次数: 1230)
回复 支持 反对

使用道具 举报

发表于 2011-11-26 23:55:11 | 显示全部楼层
我最感兴趣的还是创建一个窗体线程+1,关闭窗体线程-1的效果,非模式的为什么必须全部关闭才关闭线程呢?有意为之?

点评

tgy
两个非模式窗口是在一个线程中,当然要全部关闭才能退出线程了,要是关半一其中个窗口,就退出了线程,那另一个不就一起被销毁了?好好看下源码。  发表于 2011-11-27 10:58
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-27 15:47:03 | 显示全部楼层
关于线程内APP对象不能访问的问题,经调试原因是APP在主线程中尚未创建。只要在主线程中调用过一次APP对象,新线程中就可以访问了。原因可能是:主线程首次访问APP对象时会自动创建此对象。而新线程中可能无法创建和实例化APP对象。
最简单的方法就是在sub main()中添加app.title=app.title就可以了。让APP对象初始化一下。

点评

那就说明VB写的是Dim App As New App 一开始的时候没有初始化……  发表于 2011-11-30 20:48
tgy
我也是觉得奇怪,只要在主线程中访问过一次APP对象,创建的新线程中就可以访问,不然,新线程访问就会出错。  发表于 2011-11-28 23:08
APP对象还要初始化的?学习了……我以前C++写的山寨VB6运行库是在程序开始的时候自动初始化APP  发表于 2011-11-28 22:14
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-11-28 20:01:20 | 显示全部楼层
本帖最后由 tgy 于 2011-11-29 19:15 编辑

新版更新(版本:1.2.0):
除了常API方式调用,还增加两种activex dll方式使用方法,首先在工程中引用此DLL:
1、常规类方法调用,对应的类名为:CreateThread_TGY,方法为:VBcreatethread 参数与API方式相同。
2、类事件调用法,对应的类名为:CreateThreadEvent_TGY  线程事件名称:thread,定义时要响应事件定义(dim withevents),线程函数写在thread事件中即可,p0和p1为线程参数 long型,此法可传递更多线程参数,根据需要,只要修改类中的参数数量即可传递更多参数。此法线程函数不用写在标准模块中,使用更方便,非常值得一用。

并修正了一些错误,可以根据使用习惯和需要选择标准DLL和activex dll方式使用。
注意:一个程序内不要API和activex dll两种方法混用,不然API方式调用非模式窗口的线程将会退出,如果一定要混用,那就复制一份DLL,改名后给API方式调用。

调用例子.rar (21.59 KB, 下载次数: 1292)
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2020-4-1 22:35

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