api函数中有但在vb中使用不够稳定。如要例子请给我发信[email protected]

解决方案 »

  1.   

    在VB实现多线程很容易出非法操作,建议使用VC
      

  2.   

    http://www.csdn.net/Expert/forum.asp?typenum=8&searchKeys=%B6%E0%CF%DF%B3%CC&roomid=2&author=&tabletype=now
      

  3.   

    用ACTIVEX EXE做,功能可以实现,因为ACTIVEX EXE是一个独立的进程,
    所以不在同一进程
      

  4.   

    我用api设计了一个VB多线程的例子,很稳定
    在win2000上运行很好至于例子,下次我会在csdn上通知下,去我的主页下载(在制作当中啊)
      

  5.   

    怎样用VB写多线程
    作者:darkside 
    尽管vb5是apprent single-thread(单线程)的.但用addressof加上一些API,就可以非常容易的做多线程.(比VC容易的多,做出来的东西也一样快,因为都是用API). 每一个县城(线程,下同)约占用20毫秒的时间片.vb5有一个主线程.我们可以另外加一个工作线程.对于不清楚什么是单/多线程的程序元,我们用一个简单的列子来说明一下.
    再form里加上两个timer控件. 吧interval属性设成5000(5秒),然后在两个timer1_timer事件中放一个大loop, 如for 10000 next. 运行. 你会看到第二个timer控件不会在五秒后执行,除非timer1的for-next结束. 同样,如果你的程序中有大量的数据库读写.你的用户街面可能被"冻".这时,我们就需要用多县城来改进程序了.(当然你可以用DoEvents来避免被冻,但用DoEvents有横多副作用.这里不提).我们用的第一个API是CreateThread, VB的格式是:private declare function CreateThread Lib "kernel32" (byval pThreadAttributes as any, byval dwStackSize as long, byval lpStartAddress as long, lpParameter as any, byval dwCreationFlags as long, lpThreadID as long) as long. (从vb API text viewer中拿是最真确的语法)CreateThread的参数指出你将要创立的县城是什么样子的. CreateThread的返回值是一个县城的handle. 这里是vb的多县城初始化程序:Public Sub Initialize(lpfnBasFunc as long) 
    dim dwStackSize as long 
    dim dwCreationFlags as long 
    dim lpThreadId as long 
    dim lpParameter as long 
    dim myNull as long 
    myNull = 0& ’create a null pointer 
    dwStackSize = 0 ’0表示用exe stack size 
    dwCreationFlags = 4 ’用4表示初始化后先不激活,让别人来激活. 
    Me.Thread = CreateThread(myNull, dwStackSize, lpfnBasFunc, myNull, dwCreationFlags, lpThreadId) 
    if Me.Thread = myNull then
    Msgbox "create thread failed" 
    end if
    end Sub
    下面是两个API用来激活/暂定该线程.private declare function ResumeThread lib "kernel32"(byval hThread as long)as longprivate declare function SuspendThread lib "kernel32"(byval hThread as long)as long让我们来用一个变量表示当前县城的状态.
    public ThreadStatus as boolean
    在vb里,可用property来实现ThreadStatus的管理.
    Public property Let Enabled(byval vNewValue as boolean) 
    if vNewValue = true and Me.ThreadStatus = false then
    ResumeThread Me.Thread
    Me.ThreadStatus = True
    elseif Me.ThreadStatus = true then
    SuspendThread Me.Thread 
    Me.ThreadStatus = False 
    endif
    end Property这个简单的类可以用New Object来引用:
    ’make new thread object
    dim myThread as New clsThreads
    ’创建县城 Foo
    myThread.Initialize AddressOf Foo
    ’激活县城
    myThread.Enabled = True执行后,你可以用PVIEW95.EXE看到你的线程.
    你还可以提高你的线程的优先级.
    SetThreadPriority ’设优先级GetThreadPriority ’查优先级你把以上的程序加入timer例子,就会看到两个timer同时运行.
    这里要提醒一下. vb5的开发环境是单县城的.如果你的程序写错,或中断后试图恢复,往往会出错,有时是GPF错.总之,用vb写多线程可以写出和VC一样快的程序.而且开发容易的多,开发速度也快得多.
      

  6.   

    我欣赏您,shaker(上杉达也) 
    大公无私
      

  7.   

    建议使用activex exe建立异步处理程序来完成多线程的功能。
    如果真的要建立多线程,建议看看msdn的mtcoffee例子
      

  8.   

    那个在VB6就不能用了。(生成exe文件后exe执行会出错)
      

  9.   

    如果我用shell的方法执行一个可执行程序,如何能够在调用它的进程中判断出来这个进程已经结束或是还在运行呢?
        shell调用的可执行程序是否是两个不相关的独立进程呢?
      

  10.   

    >如果我用shell的方法执行一个可执行程序,如何能够在调用它的进程中判断出来>这个进程已经结束或是还在运行呢?
    >    shell调用的可执行程序是否是两个不相关的独立进程呢?可以,先得到新进程的句柄,然后WAIT就可以了!
      

  11.   

    VB6中用CreateThread是不行的,除非编译成P代码.
    最好不要在产品中使用,自己做做实验还是可以的.如果要达到同时执行多个任务,有几个东西可以利用:
    DoEvents      (给UI分配CPU)
    ActicveX EXE  (多进程)