首先,这东西原理不是原创,原理俺也不懂,俺只是封装DLL而已,原理要感谢老汉大牛在每个线程函数第一句写MTInit,就能保证线程稳定性了。。
只是这个DLL提供了一些其他的线程操作导出函数,比较乱源文件下载:http://good.gd/546782.htmDLL大小5.5K,md5:44784B7B5EF685BB3C64976B722D0CF2
只是这个DLL提供了一些其他的线程操作导出函数,比较乱源文件下载:http://good.gd/546782.htmDLL大小5.5K,md5:44784B7B5EF685BB3C64976B722D0CF2
DLL稳定性还是能保证的,MTInit这个函数绝对是十分稳定的,不放心别的函数的话,可以自己使用CreateThread创建线程然后在线程加入MTInit而不使用DLL中的导出MTNew*的那3个创建线程的APIPS:这个DLL中操作线程的函数不是使用kernel32导出的,而全部使用了NTDLL导出的线程操作函数。MTNew1——RtlCreateUserThread——ZwCreateThread【这等同与CreateThread】
MTNew2——RtlCreateUserThread——ZwCreateThread【等同CreateRemoteThread】
MTNew2——SHCreateThread【无聊提供的,参数只有一个,开始地址】
MTExit——RtlExitUserThread【退出线程,ExitThread】
MTCall——ZwSetContextThread【在指定的线程执行指定的函数,第二个参数传地址,比如可以传ExitThread的地址】
MTOpen——ZwOpenThread
MTKill——ZwTerminateThread
MTResume——ZwResumeThread
MTSuspend——ZwSuspendThread
MoveMemory——__vbaCopyBytesZero
Private Sub Command1_Click()
MsgBox "中断"
End SubPrivate Sub Form_Load()
Me.Timer1.Interval = 1000End SubPrivate Sub Timer1_Timer()
Label1.Caption = Now
End SubMsgBox后Timer还会走吗?
惊现陈辉大牛啊,膜拜膜拜本来翻译了一篇外国佬写的VC使用NtCreateThread到VB中,所有前面的申请步骤都成功了,就是到NtCreateThread就玩完了就想到很久钱看过的RtlCreateUserThread了
关键是MSVBVM60的问题,VB6的运行时库多线程肯定都是不安全的,不过听老汉说那是什么对象没创建的问题,还反出个一个API CreateIExprSrvObj,加在线程第一句就可以稳定了,不过还是不能使用对象,使用对象,比如MsgBox程序一样崩溃,而RtlCreateUserThread使用MsgBox线程执行错误自动退出,程序倒是不会崩溃
http://www.vb-decompiler.com/viewtopic.php?f=4&t=1771
“绝对是十分稳定的”,你多点两三次 Command1 试试,看程序 Game Over 不!
我的测试结果跟我用类对象、采用CreateThread()的效果是一样的:
第一次执行还没崩溃过;第二次极少崩溃;第三、四次几乎都崩溃了!“绝对是十分稳定的”,你多点两三次 Command1 试试。
我没有说不对,我这里只是说MTInit能使线程稳定执行不崩溃,而没有说你看多少线程程序不假死。
而且,你叫我连续点几次command1,没错,程序的确假死了,不过那不是线程的问题,是俺写的线程函数的问题,因为每个线程都在操作list1,如果你把线程函数改为其他比如使用URLDownloadToFile下载文件啊,那你开N个线程也不会死。呵呵,不信你把后面comand1单击后的msgbox k这行代码去掉,是不是点10次都行?我这里说的是,控制线程稳定性而不是说你写的函数导致程序假死就说线程崩溃。
循环次次数没必要搞成10万,你改成1000甚至100都行。还有,跟那个 MsgBox 无关吧。
还有,你那个 For循环的写法,我觉得好怪异啊,干吗要那样在循环体内对i的值进行判断呢?过程 test() 的代码我简单修改了一下:
Public Sub test()
MTInit '如果不加上这个,线程一执行就会死掉
Dim i&
Form1.List1.Clear
'For i = 0 To 100000
For i = 0 To 100
Form1.List1.AddItem CStr(i)
Form1.Label1.Caption = i
'If i = 10000 Then MTExit
Next
Call MTExit
End Sub
多数时候点第二次,进程就崩溃了。
山野哥可以解释一下为什么吗?
我还以为你说Msgbox弹出程序挂起的原因。你是说等第一次线程执行完毕后点第二次,等第二次完毕后点第三次,那就不可能有问题了,反正我这里使用MTNew1+MTInit点多少次都不会有问题 我点了10来次,没问题
也许与其说是"向着单元模型靠近",还不如说是把MS用ACTIVEX方式实现单元线程的一些未公开的API拆出来组装来组装去.
好吧,这是你个人的认识,似其实这反出VB多线程原来是在看雪发布的,那里的家伙们都没说啥,你发表什么无用论?如果VB真的不适合多线程,为什么那么多人想出那么多方法去“强制”VB实现?
(CSDN首页还有个啥《VB无所不能:VB多线程(2)》貌是这标题的文章)VB已经没落了,研究这些VB缺陷的人,并且有能力提供一些鸡肋的“克服”方法的人,都是出于爱好而已,现在,VB多线程不多线程,有啥区别?这只是无聊,无聊的爱好而已“本着佛挡杀佛,魔挡弑魔的毁灭精神”这句话,呵呵,以前我记得CSDN有人发过暴力搞Tls内存的,还挺多人支持,你咋不说还有你说的,他们“不理解面向对象”以及“不理解为什么会有这样的限制”,呵呵,笑而不语
》还有你说的,他们“不理解面向对象”以及“不理解为什么会有这样的限制”,呵呵,笑而不语你接着笑吧, 笑有多种,有傻笑,有大笑, 有耻笑,我是最后一种,你呢?
额,口水战我不喜欢,你厉害,你经验是比我多,嗯,原理我不懂,我不懂ASM,我只懂写一个无聊的DLL,你了解,你厉害,呵呵,行吧,说一句无聊话,大家用不用,不是你我一句话可以说的,而且我标题写的很清楚了,这只是无聊,莫认真。
其他你爱说啥说啥,这句话俺反对,你感觉我在误人子弟?
嘿,真郁闷,一个DLL函数,你爱用不用,导出的函数参数精简了一些就误人子弟了?
CreateThread百度一下就能知道原型和调用方法,为何说云里雾里?
这只是鸡肋的东西,无聊的东西,没任何“实战”价值的东西,给爱琢磨的人用的,不是给那种整天说着稳定性稳定性的大侠用的误人子弟和走弯路这根本是无锡只谈,你感觉这东西用了,新手就不会去学CreateThread还是说用了这东西,他就不懂标准的多线程了?
还有就是凡是都有否则。如果你有真真切切的关于此内容方面的想法,思路,评价,请一一说出来,大家共同讨论,否则还是请lz别再置这无味之气了。 我也不希望把技术讨论弄到人身攻击的层面上去说。
不敢说是曲高和寡,但确实没法让人接受, 没办法, 我没什么新鲜的,
我只是坚信我看过的大量有关这方面的资料和我测试的事实是没错的。
但实际并非如此。我都是把工程编译成 .exe 来运行的,在 IDE下运行,实在太不放心了。 ^_^
LZ ,你试一下我改写后的代码,再作结论吧。
[原创]全球首创? 再次突破VB极限!VB真正稳定多线程(第二季,可以用Msgbox了)