文章收藏-FAQ 位置:电脑学习网

怎样用 VB 编写多线程程序

尽管 VB5.0 是单线程的,但用 addressof 加上一些 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
     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 long
      private 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 
      end if
      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 的开发环境是单线程的,如果你的程序写错,或中断后试图恢复,往往会出错,有时是严重出错。总之,用 VB 的多线程可以写出和 VC++ 一样快的程序,而且开发容易的多,开发效率也快得多。

     [文章来源:“十万个为什么”电脑学习网]
     [网络地址:http://why100000.com]
     [版权声明:除本站部分特别声明禁止转载的专稿外,其他的文章可以自由转载,但请务必注明出处和原始作者。本站文章版权归文章原作者所有。如果本站转载的文章有版权问题请联系本站,我们会尽快予以更正。]
 

【字体:[大] [中] [小] 【加入收藏】 【发表评论】 【关闭本窗口】

Copyright © “十万个为什么”电脑学习网 2000-2007 陕ICP备06007929号
站务联系:MSN & Email:zhangking2008@gmail.com  QQ:9365822