Results 1 to 6 of 6

Thread: nice one

  1. #1

    Thread Starter
    Member
    Join Date
    Sep 2000
    Posts
    49
    When i'm using these api's instead of a shell command.In my application when a user clicks a button it executes a command which kicks off a data copy. The problem I have is the data copy can take in upwards of 30 minutes to complete. Durring this time the executable is waiting for the command window to close, then pops a box saying the copy is complete. While the copy is happening the executable is tied up and the user cannot do anything till it is finished. How can I free it up in case the user wants to cancel the copy.

    The API's is:
    Declare Function WaitForSingleObject Lib _
    "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds _
    As Long) As Long

    Declare Function CreateProcessA Lib "kernel32" _
    (ByVal lpApplicationName As Long, ByVal lpCommandLine As _
    String, ByVal lpProcessAttributes As Long, ByVal _
    lpThreadAttributes As Long, ByVal bInheritHandles As Long, _
    ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, _
    ByVal lpCurrentDirectory As Long, lpStartupInfo As _
    STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) _
    As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject _
    As Long) As Long

    and the function is :
    Public Sub ExecCmd(cmdline$)
    Dim proc As PROCESS_INFORMATION
    Dim start As STARTUPINFO
    'Initialize the STARTUPINFO structure:
    start.cb = Len(start)
    start.dwFlags = STARTF_USESHOWWINDOW
    start.wShowWindow = SW_HIDE
    'Start the shelled application:
    ret& = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _
    NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
    Call waiting_process
    'Wait for the shelled application to finish:
    ret& = WaitForSingleObject(proc.hProcess, INFINITE)
    ret& = CloseHandle(proc.hProcess)
    End Sub


  2. #2
    Guest
    Add a DoEvents and the user can be able to press cancel.

    Code:
    Declare Function WaitForSingleObject Lib _ 
    "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds _ 
    As Long) As Long 
    
    Declare Function CreateProcessA Lib "kernel32" _ 
    (ByVal lpApplicationName As Long, ByVal lpCommandLine As _ 
    String, ByVal lpProcessAttributes As Long, ByVal _ 
    lpThreadAttributes As Long, ByVal bInheritHandles As Long, _ 
    ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, _ 
    ByVal lpCurrentDirectory As Long, lpStartupInfo As _ 
    STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) _ 
    As Long 
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject _ 
    As Long) As Long 
    
    
    Public Sub ExecCmd(cmdline$) 
    Dim proc As PROCESS_INFORMATION 
    Dim start As STARTUPINFO 
    'Initialize the STARTUPINFO structure: 
    start.cb = Len(start) 
    start.dwFlags = STARTF_USESHOWWINDOW 
    start.wShowWindow = SW_HIDE 
    'Start the shelled application: 
    ret& = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _ 
    NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc)
    DoEvents 'maybe somewhere here?
    Call waiting_process 
    'Wait for the shelled application to finish: 
    ret& = WaitForSingleObject(proc.hProcess, INFINITE) 
    ret& = CloseHandle(proc.hProcess) 
    End Sub

    And incase your wondering how I got the code to come out like that: [code]Your code[/code].

  3. #3

    Thread Starter
    Member
    Join Date
    Sep 2000
    Posts
    49

    Lightbulb freezing

    How can i unfreeze it while processing

  4. #4
    Guest
    DoEvents should keep the program from freezing. Try adding the DoEvents to a few more places in the code.

  5. #5

    Thread Starter
    Member
    Join Date
    Sep 2000
    Posts
    49

    Re-good one

    It's because, while the shell is processing, the cursor always stays at the same line till the processing is finish,
    (ret& = WaitForSingleObject(proc.hProcess, INFINITE)).

  6. #6
    Fanatic Member gwdash's Avatar
    Join Date
    Aug 2000
    Location
    Minnesota
    Posts
    666
    See Here, i showed how to add the DoEvents:

    Or, if you don't like cross-threading:
    Code:
    'Module code 
    Private Type STARTUPINFO 
    cb As Long 
    lpReserved As String 
    lpDesktop As String 
    lpTitle As String 
    dwX As Long 
    dwY As Long 
    dwXSize As Long 
    dwYSize As Long 
    dwXCountChars As Long 
    dwYCountChars As Long 
    dwFillAttribute As Long 
    dwFlags As Long 
    wShowWindow As Integer 
    cbReserved2 As Integer 
    lpReserved2 As Long 
    hStdInput As Long 
    hStdOutput As Long 
    hStdError As Long 
    End Type 
    
    Private Type PROCESS_INFORMATION 
    hProcess As Long 
    hThread As Long 
    dwProcessID As Long 
    dwThreadID As Long 
    End Type 
    
    Private Declare Function WaitForSingleObject Lib _ 
    "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds _ 
    As Long) As Long 
    
    Declare Function CreateProcessA Lib "kernel32" _ 
    (ByVal lpApplicationName As Long, ByVal lpCommandLine As _ 
    String, ByVal lpProcessAttributes As Long, ByVal _ 
    lpThreadAttributes As Long, ByVal bInheritHandles As Long, _ 
    ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, _ 
    ByVal lpCurrentDirectory As Long, lpStartupInfo As _ 
    STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) _ 
    As Long 
    
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject _ 
    As Long) As Long 
    
    Private Const NORMAL_PRIORITY_CLASS = &H20& 
    Private Const INFINITE = &HFFFF
    '-------Start New Code-------
    Private Const WAIT_TIMEOUT = &H102
    '-------End New Code---------
    
    
    'Form code 
    Public Sub ExecCmd(cmdline$) 
    Dim proc As PROCESS_INFORMATION 
    Dim start As STARTUPINFO 
    
    'Initialize the STARTUPINFO structure: 
    start.cb = Len(start) 
    
    'Start the shelled application: 
    ret& = CreateProcessA(0&, cmdline$, 0&, 0&, 1&, _ 
    NORMAL_PRIORITY_CLASS, 0&, 0&, start, proc) 
    
    'Wait for the shelled application to finish: 
    ' our program from appearing to lock up while it waits.
    '-------Start New Code-------
    Do
        DoEvents
        ret& = WaitForSingleObject(proc.hProcess, 0)
    Loop While ret& = WAIT_TIMEOUT
    '-------End New Code---------
    ret& = CloseHandle(proc.hProcess) 
    End Sub
    GWDASH
    [b]VB6, Perl, ASP, HTML, JavaScript, VBScript, SQL, C, C++, Linux , Java, PHP, MySQL, XML[b]

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width