首先,这东西原理不是原创,原理俺也不懂,俺只是封装DLL而已,原理要感谢老汉大牛在每个线程函数第一句写MTInit,就能保证线程稳定性了。。
只是这个DLL提供了一些其他的线程操作导出函数,比较乱源文件下载:http://good.gd/546782.htmDLL大小5.5K,md5:44784B7B5EF685BB3C64976B722D0CF2

解决方案 »

  1.   

    好吧,我承认,这个的确是多线程。文件也很小,我想使用这个DLL,但因为没见过代码,不知道安全性如何……总之,不错,顶一个。
      

  2.   


    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
      

  3.   

    VB6调用DLL实现多线程的稳定性不如使用Timer控件数组模拟实现多线程稳定。
      

  4.   

    9楼:
    Private Sub Command1_Click()
    MsgBox "中断"
    End SubPrivate Sub Form_Load()
    Me.Timer1.Interval = 1000End SubPrivate Sub Timer1_Timer()
    Label1.Caption = Now
    End SubMsgBox后Timer还会走吗?
      

  5.   

    不,其实RtlCreateUserThread还是比较稳定的,不信可以对比一下MTNew1和MTNew3创建线程,如果MTNew1创建线程第一句不写MTInit线程会错误退出,但是程序不崩溃,而MTNew3(CreateThread)创建线程如果不加上MTInit立马整个程序崩溃。好吧,还不明白的话,谁都知道VB多线程中使用MsgBox会崩溃,MTInit也不能解决,但是使用MTNew1、MTNew2继承RtlCreateUserThread创建的线程中使用MsgBox,线程会死掉,但程序不崩溃。而CreateThread的话
      

  6.   

    这些api我早公布了,其实好是不稳定,在vb中使用还是会出现n多问题的。只要线程体(StartAddress)在vb内就会出问题,其实不管是CreateThread还是RtlCreateUserThread最后都是调用NtCreateThread问题的关键不是出在函数上。
      

  7.   

    http://blog.csdn.net/chenhui530/archive/2008/10/21/3119107.aspx看这里
      

  8.   


    惊现陈辉大牛啊,膜拜膜拜本来翻译了一篇外国佬写的VC使用NtCreateThread到VB中,所有前面的申请步骤都成功了,就是到NtCreateThread就玩完了就想到很久钱看过的RtlCreateUserThread了
    关键是MSVBVM60的问题,VB6的运行时库多线程肯定都是不安全的,不过听老汉说那是什么对象没创建的问题,还反出个一个API CreateIExprSrvObj,加在线程第一句就可以稳定了,不过还是不能使用对象,使用对象,比如MsgBox程序一样崩溃,而RtlCreateUserThread使用MsgBox线程执行错误自动退出,程序倒是不会崩溃
      

  9.   

    其实很多是从这里启发的
    http://www.vb-decompiler.com/viewtopic.php?f=4&t=1771
      

  10.   

    山野哥,我觉得你说的有点过了吧!
    “绝对是十分稳定的”,你多点两三次 Command1 试试,看程序 Game Over 不!
    我的测试结果跟我用类对象、采用CreateThread()的效果是一样的:
    第一次执行还没崩溃过;第二次极少崩溃;第三、四次几乎都崩溃了!“绝对是十分稳定的”,你多点两三次 Command1 试试。
      

  11.   


    我没有说不对,我这里只是说MTInit能使线程稳定执行不崩溃,而没有说你看多少线程程序不假死。
    而且,你叫我连续点几次command1,没错,程序的确假死了,不过那不是线程的问题,是俺写的线程函数的问题,因为每个线程都在操作list1,如果你把线程函数改为其他比如使用URLDownloadToFile下载文件啊,那你开N个线程也不会死。呵呵,不信你把后面comand1单击后的msgbox k这行代码去掉,是不是点10次都行?我这里说的是,控制线程稳定性而不是说你写的函数导致程序假死就说线程崩溃。
      

  12.   

    如果你把MTInit去掉了,你看看你线程出来后,特别是使用CreateThread的,程序整个立刻崩溃。
      

  13.   

    不是‘假死’,是进程崩溃。我的意思不是线程未执行完就点,而是:你等线程执行完后,又点 Command1 一下,执行完后,再继续点……
    循环次次数没必要搞成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
    多数时候点第二次,进程就崩溃了。
    山野哥可以解释一下为什么吗? 
      

  14.   


    我还以为你说Msgbox弹出程序挂起的原因。你是说等第一次线程执行完毕后点第二次,等第二次完毕后点第三次,那就不可能有问题了,反正我这里使用MTNew1+MTInit点多少次都不会有问题 我点了10来次,没问题
      

  15.   

    还有我那个“怪异”的的For写法其实是为了验证MTExit的功能而已
      

  16.   


    也许与其说是"向着单元模型靠近",还不如说是把MS用ACTIVEX方式实现单元线程的一些未公开的API拆出来组装来组装去.
      

  17.   

    以上几楼对这个实现的方法的认识是错的这也不是靠近单元模型,这完全是背道而驰.大多数的人对vb的多线程存在误区, 认为vb成心阻止你实现多线程, 于是他们想方设法的, 取消各种限制但他们根本就不理解为什么会有这样的限制, 也许他们会有疑问, 为什么会这样? 但他们却从不多想本着佛挡杀佛,魔挡弑魔的毁灭精神, 莽撞的改造vb, 这其实是和系统在较劲, 他们认为他们取得了毁灭银河系的成绩,然后到处炫耀这完全是不值一提的内容, 只是糊弄新手用的, 高手看到这些东西即便看到他可能可以正常执行一下,也不会用这是本质,  上次给别的帖子写了个小的汇编链接函数, 用于解决 C call在vb中的应用, 那样的代码都有人说不值得提倡, 那这个帖子的东西更是狗屁一文不值, 说的可能过激, 请大家各自斟酌吧
      

  18.   


    好吧,这是你个人的认识,似其实这反出VB多线程原来是在看雪发布的,那里的家伙们都没说啥,你发表什么无用论?如果VB真的不适合多线程,为什么那么多人想出那么多方法去“强制”VB实现?
    (CSDN首页还有个啥《VB无所不能:VB多线程(2)》貌是这标题的文章)VB已经没落了,研究这些VB缺陷的人,并且有能力提供一些鸡肋的“克服”方法的人,都是出于爱好而已,现在,VB多线程不多线程,有啥区别?这只是无聊,无聊的爱好而已“本着佛挡杀佛,魔挡弑魔的毁灭精神”这句话,呵呵,以前我记得CSDN有人发过暴力搞Tls内存的,还挺多人支持,你咋不说还有你说的,他们“不理解面向对象”以及“不理解为什么会有这样的限制”,呵呵,笑而不语
      

  19.   

    再补充点吧, 别让lz误会,我要跟你作对》VB已经没落了,研究这些VB缺陷的人,并且有能力提供一些鸡肋的“克服”方法的人,都是出于爱好而已,现在,VB多线程不多线程,有啥区别?这只是无聊,无聊的爱好而已vb在没落,我承认,而且赞同,克服或者说弥补vb的缺陷没错, 但不应该以错误的方式而且误导人的方式,让大家都是云里雾里的理解,这是误人子弟,特别是对于新手来说,这可能要让他走很长的弯路》“本着佛挡杀佛,魔挡弑魔的毁灭精神”这句话,呵呵,以前我记得CSDN有人发过暴力搞Tls内存的,还挺多人支持,你咋不说你对这个方法还不了解,这就是那个方法的挂羊头卖狗肉的实现
    》还有你说的,他们“不理解面向对象”以及“不理解为什么会有这样的限制”,呵呵,笑而不语你接着笑吧, 笑有多种,有傻笑,有大笑, 有耻笑,我是最后一种,你呢?
      

  20.   


    额,口水战我不喜欢,你厉害,你经验是比我多,嗯,原理我不懂,我不懂ASM,我只懂写一个无聊的DLL,你了解,你厉害,呵呵,行吧,说一句无聊话,大家用不用,不是你我一句话可以说的,而且我标题写的很清楚了,这只是无聊,莫认真。
      

  21.   


    其他你爱说啥说啥,这句话俺反对,你感觉我在误人子弟?
    嘿,真郁闷,一个DLL函数,你爱用不用,导出的函数参数精简了一些就误人子弟了?
    CreateThread百度一下就能知道原型和调用方法,为何说云里雾里?
    这只是鸡肋的东西,无聊的东西,没任何“实战”价值的东西,给爱琢磨的人用的,不是给那种整天说着稳定性稳定性的大侠用的误人子弟和走弯路这根本是无锡只谈,你感觉这东西用了,新手就不会去学CreateThread还是说用了这东西,他就不懂标准的多线程了?
      

  22.   

    不跟你再进行这种无谓的争辩了,我没有在这里说你或者任何人垃圾任何人都有他优势的一面,也许我只是碰巧我对这个研究的比较深一些而已我也没有自大什么,只是以我的个人观点评论这个内容,也许我说的话有些过激,但我也一再表示,lz不要误会, 没有针对你, 所以请你也不要再针对我个人进行评判,我对你尊重,希望你也抱着同样的心理对我。
    还有就是凡是都有否则。如果你有真真切切的关于此内容方面的想法,思路,评价,请一一说出来,大家共同讨论,否则还是请lz别再置这无味之气了。 我也不希望把技术讨论弄到人身攻击的层面上去说。
      

  23.   

     如果你觉得我的评论对你来说,太过分了,我先说声对不起,这确实是我的大缺点,遇到感兴趣的问题总喜欢“激情”点,lz如有觉得冒犯,还是希望谅解一下吧。至于其他的,愿意说是无用论就无用论吧,其实很多东西我早就说过了,无论是在csdn还是vbgood;
    不敢说是曲高和寡,但确实没法让人接受, 没办法, 我没什么新鲜的, 
    我只是坚信我看过的大量有关这方面的资料和我测试的事实是没错的。
      

  24.   

    看来你没试我修改后的代码。从表面上看,我改动后的代码并不会出现什么不正常的地方。
    但实际并非如此。我都是把工程编译成 .exe 来运行的,在 IDE下运行,实在太不放心了。 ^_^
    LZ ,你试一下我改写后的代码,再作结论吧
      

  25.   

    楼主,看起来好像这个DLL是用类似这帖子里说的原理做的一些封装,对吗?http://www.vbgood.com/thread-93124-1-1.html
    [原创]全球首创? 再次突破VB极限!VB真正稳定多线程(第二季,可以用Msgbox了)