遇到一个这样的问题,程序需要创建N个对象,由于对象本身较复杂,所以每创建一个对象需要一些时间,如果一两个还好,如果一下建100个,则需要很多时间,我想能否通过建立线程来解决呢?如创建10个线程,每个线程创建10个对象,能否提高些效率呢?如果可以,应该如何建创建线程呢?不要Activex exe的。要进程内部创建!

解决方案 »

  1.   

    VB不能做多线程吧,载IDE里可以运行,编译为可执行程序后会出问题的
      

  2.   

    是啊,多线程并不能提高些效率,使用多线程一般是为了解决等待慢速操作(比如硬盘网络)而使CPU处于闲置状态的问题,可以提高效率;或者一个单独的需要较长时间的操作不至于影响主界面的相应,并且可以随时取消,在VB中这个可以用DoEvnets来解决;或者确实需要并行的场合。楼主的问题用多线程不合适
      

  3.   

    'clsThreads
    Option Explicit
    Option Compare Text
    Option Base 0Private Type udtThread
        Handle As Long
        Enabled As Boolean
    End TypePrivate uThread As udtThreadPrivate Const CREATE_SUSPENDED As Long = &H4
    Private Const THREAD_BASE_PRIORITY_IDLE  As Long = -15
    Private Const THREAD_BASE_PRIORITY_LOWRT  As Long = 15
    Private Const THREAD_BASE_PRIORITY_MAX As Long = 2
    Private Const THREAD_BASE_PRIORITY_MIN As Long = -2
    Private Const THREAD_PRIORITY_HIGHEST  As Long = THREAD_BASE_PRIORITY_MAX
    Private Const THREAD_PRIORITY_LOWEST  As Long = THREAD_BASE_PRIORITY_MIN
    Private Const THREAD_PRIORITY_ABOVE_NORMAL As Long = (THREAD_PRIORITY_HIGHEST - 1)
    Private Const THREAD_PRIORITY_BELOW_NORMAL  As Long = (THREAD_PRIORITY_LOWEST + 1)
    Private Const THREAD_PRIORITY_IDLE  As Long = THREAD_BASE_PRIORITY_IDLE
    Private Const THREAD_PRIORITY_NORMAL As Long = 0
    Private Const THREAD_PRIORITY_TIME_CRITICAL As Long = THREAD_BASE_PRIORITY_LOWRTPrivate Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
    Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
    Private Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
    Private Declare Function GetThreadPriority Lib "kernel32" (ByVal hThread As Long) As Long
    Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
    Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
    Public Sub Initialize(ByVal lpfnBasFunc As Long)Dim lStackSize As Long, lCreationFlags As Long, lpThreadId As Long, lNull As Long
        
    On Error Resume Next
    lNull = 0
    lStackSize = 0
    lCreationFlags = CREATE_SUSPENDED
    uThread.Handle = CreateThread(lNull, lStackSize, lpfnBasFunc, lNull, lCreationFlags, lpThreadId)
    If uThread.Handle = lNull Then MsgBox "Create thread failed!"
        
    End Sub
    Public Property Get Enabled() As Boolean
        
    On Error Resume Next
    Enabled = uThread.EnabledEnd Property
    Public Property Let Enabled(ByVal vNewValue As Boolean)
        
    On Error Resume Next
    If vNewValue And (Not uThread.Enabled) Then
        ResumeThread uThread.Handle
        uThread.Enabled = True
    ElseIf uThread.Enabled Then
        SuspendThread uThread.Handle
        uThread.Enabled = False
    End IfEnd Property
    Public Property Get Priority() As LongOn Error Resume Next
    Priority = GetThreadPriority(uThread.Handle)End Property
    Public Property Let Priority(ByVal vNewValue As Long)On Error Resume Next
    If vNewValue = -2 Then
        Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_LOWEST)
    ElseIf vNewValue = -1 Then
        Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_BELOW_NORMAL)
    ElseIf vNewValue = 0 Then
        Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_NORMAL)
    ElseIf vNewValue = 1 Then
        Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_ABOVE_NORMAL)
    ElseIf vNewValue = 2 Then
        Call SetThreadPriority(uThread.Handle, THREAD_PRIORITY_HIGHEST)
    End IfEnd Property
    Private Sub Class_Terminate()On Error Resume Next
    Call TerminateThread(uThread.Handle, 0)End Sub'call 
    Dim myThread As New clsThreads
    On Error Resume Next
    With myThread
        .Initialize AddressOf 子程序或函数
        .Enabled = True
    End With
      

  4.   

    你上面的问题使用多线程并不会有所提高,你需要明白瓶颈在哪你可以利用 对象连接池 来提升创建对象的速度
    请搜索 Com+,MTS ,连接池 等关键字
      

  5.   

    如果你做的是访问100次数据库,每次数据库查询需要5秒钟,那么单线程处理需要大约500秒,多线程处理可能花的时间会少很多。因为当一个线程提交查询以后CPU主要在等待,这段空闲时间他可以处理别的线程
    如果你做的是进行100次大的循环累加,每次循环需要5秒,那么单线程处理需要大约500秒,多线程处理时间可能大于500秒。因为线程间的切换需要消耗CPU时间的。特别是线程比较多的时候,系统开销较大。
      

  6.   

    网络编程时,Server端就会用到多线程来处理多连接并发
      

  7.   

    我想楼主可能混淆了某些概念。单线程(STA)、多线程单元(MTA),在MTA中,可在任意线程中调用函数。
    需要注意的是,VB支持“调用”MTA和STA,但它仅仅支持创建STA。应该清楚,对多个STA线程的支持与在MTA中创建的对象的支持是不同的。