在网上看了一些资料,有些资料说过在vb中实现程序的同步执行。但基本上说的都是某个控件(如AD0)可以提供控制同步或异步直销的方法/机制。我想问的是,如果所引用的控件/对象没有提供同步异步的方法,那么如何确保用vb编写的程序同步执行呢?    我个人认为默认情况下vb是异步执行的,比如下面的代码。
    dim a as new class1
    a.method1
    a.method2
    a.method3
    在以前vb编写的代码中发现过这样的问题,即上述三个方法是异步执行的,如a.method1启动了,然后a.method2便立即被执行,而没有等待a.method1执行完成。以上情况是在vba编程时出现过,不知是因为如此才导致程序的异步执行??而我需要进行同步执行,即在a.method1返回结果后再执行a.method2,不知怎么控制。
    另外,“纯”VB默认的执行方式是同步执行还是异步执行呢?可否进行人工控制程序的同步或异步执行
    请高手指点,多谢了

解决方案 »

  1.   

    可以使用API函数WaitForSingleObject比如:
    [转贴]
    '模块中
    Option ExplicitPublic Const SYNCHRONIZE = &H100000
    Public Const INFINITE = &HFFFFFFFF
    Public Const WAIT_TIMEOUT = &H102&Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long'Form中
    Option ExplicitPrivate Sub Command1_Click()
        Dim pId As Long, pHnd As Long, ret    pId = Shell("Notepad", vbNormalFocus)
        pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
        If pHnd <> 0 Then
            Debug.Print "Waiting " & pHnd & " ..."
            Do
                ret = WaitForSingleObject(pHnd, 0)
                DoEvents
            Loop While ret = WAIT_TIMEOUT
            CloseHandle pHnd
            Debug.Print pHnd & " Terminate."
        End If
    End Sub
      

  2.   

    当然了,如果所有代码都是你自己编写的,那么肯定是同步的。
       是我没有说清楚,我的“纯”Vb是指通过VS开发的,不是vba形式的,虽然二者可能没有任何区别,在没有确定前我才这样说的。   我想问的是,在vb代码中引用了其他对象,就是各种控件了,包括DLL引用啦,这时执行这样对象的方法时,vb还能否实现同步。我确实遇到过不同步的情况,即在程序中顺序写下的代码(对象的方法,类似a.method1)不能同步执行,而是执行完第一个方法紧接着执行下一行代码,不管上个代码是否执行完毕。我想问在这种情况下如何实现同步
      

  3.   

    "即在a.method1返回结果后再执行"你说的写好的代码指哪部分?
      

  4.   

    三楼我的那段代码是用shell打开记事本notepad,然后阻塞等待,直到记事本关闭才继续往下执行
      

  5.   

    viena(维也纳nn-实心木头人) :
         你的代码中Public Const WAIT_TIMEOUT = &H102& 这个变量值怎么最后还有一个&字符?有什么用吗?    另外,你这种方法好像比较适合用Shell这种方式启动其他程序吧。如果我在程序中仅仅是通过New操作符来生成对象,那么是如何获得其PID呢?比如说下面代码
         dim fso as new FileSystemOjbect
         
         fso.copyFile file1,file2
         fso.deletefile file1
     
         那么我如何确保在执行完copyFile后才执行DeleteFile呢?(当然了,FileSystemObject对象应该是支持同步的吧,即CopyFile执行完才执行DeleteFile,不过我也没有确认,在这里只是举个例子,我想控制的就是这种情况。)。
      

  6.   

    to  jlum99(闲人) :
      写好的代码就是指a.method1了。有一点可能没有说清楚。这里的a我指的是类似于DLL调用,或者说事先写好的功能模块,举个例子,比如FileSystemOjbect对象(不是我们自己写的类,不是自己完全写得代码(我指完全vb语言写得,没有调用任何多余模块,如上的FSO)),如果该对象在设计之初没有提供状态检测的功能,那么你是如何去判断
      

  7.   

    to 楼主:&H表示16进制
    &是Long的类型声明字符我只是句一个例子,我也没有做过在VB中的同步WaitForSingleObject一般用于线程同步的,但一般不在VB中用多线程,汗~这个句柄不一定是进程句柄,多线程中线程同步用信号量来进行同步
    用CreateSemaphore函数来得到这个信号量句柄
      

  8.   

    用信号量比较麻烦,还是用互斥Mutex简单一些,
    用CreateMutex得到互斥对象句柄,用ReleaseMutex释放互斥对象Public Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
    Public Declare Function ReleaseMutex Lib "kernel32" Alias "ReleaseMutex" (ByVal hMutex As Long) As Long