Avatar of C0ding
C0ding
 asked on

VB6: Sleep, DoEvent, Loop, looking for best way of...

Hello

I asked this question before, since nobody respond to it,
I decide to ask it again to see if i can get a better results.

What i want to do is something simple, i am working in a VB6 project,
My goal is to execute a command code to a program, but before that
i want my project to wait for that program to be load, then apply code.

Ive been using the Sleep method, and actually is been working very well,
but i was wondering if i could do it better with DoEvent or something better.

Private Sub Form_Load()
Shell "Program-to-be-execute.exe"

Sleep 3 'wait like three seconds or so

Then after the program load up, is time to apply my code here.
I even add a second code to detect if the windows program is ready or not
'f return not ready, then another three seconds are applyed to my project.

End Sub

Thanks in advance

============
prior related question: https://www.experts-exchange.com/questions/26841079/DoEvent-or-Loop.html
aikimark -- zone advisor
Visual Basic Classic

Avatar of undefined
Last Comment
C0ding

8/22/2022 - Mon
TommySzalapski

It depends on what the other program is. If that program has a visible API that calls events (or if you wrote the other program) then it can be done.
In the general case though, if you can get a 'not ready' returned, then that's pretty good.

You could spin lock
While Not Ready
Wend

I'd at least shorten the wait time to a half second or so. Three seconds is so long (in the computer world)
SOLUTION
GrahamSkan

Log in or sign up to see answer
Become an EE member today7-DAY FREE TRIAL
Members can start a 7-Day Free trial then enjoy unlimited access to the platform
Sign up - Free for 7 days
or
Learn why we charge membership fees
We get it - no one likes a content blocker. Take one extra minute and find out why we block content.
Not exactly the question you had in mind?
Sign up for an EE membership and get your own personalized solution. With an EE membership, you can ask unlimited troubleshooting, research, or opinion questions.
ask a question
ASKER CERTIFIED SOLUTION
Log in to continue reading
Log In
Sign up - Free for 7 days
Get an unlimited membership to EE for less than $4 a week.
Unlimited question asking, solutions, articles and more.
SOLUTION
Log in to continue reading
Log In
Sign up - Free for 7 days
Get an unlimited membership to EE for less than $4 a week.
Unlimited question asking, solutions, articles and more.
BrianVSoft

This code is a 'paste' from Exp.Exchange legend "IdleMind"
It may add to your solution..
(search Exp.Exchange for "WaitForInputIdle" )
PS.. How does one extract a LINK to an Exp.Exchange question that you have browsed to??
Private Const INFINITE = -1& 
Private Const PROCESS_ALL_ACCESS = &H1F0FFF

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long 
 
...  
    Dim FileName As String
    Dim params As String
    FileName = "C:\program.exe"
    params = "some params here"

    Dim pid As Long
    Dim lngProcess As Long
    pid = Shell(Chr(34) & FileName & Chr(34) & " " & params, vbNormalFocus)
    lngProcess = OpenProcess(PROCESS_ALL_ACCESS, 0&, CLng(pid))
    If lngProcess <> 0 Then
        WaitForInputIdle lngProcess, INFINITE
        TerminateProcess lngProcess, 0&
    End If

Open in new window

GrateProgrammer

Try this code to see if the application is running.
'code for Form1
Private Sub cmdCheck_Click()
'check if application is running
If IsTaskRunning(sAppName) Then
MsgBox "Application '" & sAppName & "' is running!"
Else
MsgBox "Application '" & sAppName & "' is not running!"
End If

End Sub

Private Sub cmdClose_Click()
'close application
Call EndTask(sAppName)

End Sub

Private Sub cmdStart_Click()
'start an application
Shell sAppPath, vbNormalFocus

End Sub

Private Sub Form_Load()

  sAppName = "Microsoft Access"
  sAppPath = "C:\Program Files\access97\Office\MSACCESS.EXE"

End Sub


'Code for Module1


Option Explicit
 'API's Function Declarations
 Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long
 Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
 Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As String) As Long
 'API Constants
 Public Const GWL_STYLE = -16
 Public Const WS_DISABLED = &H8000000
 Public Const WM_CANCELMODE = &H1F
 Public Const WM_CLOSE = &H10
 Public sAppName As String, sAppPath As String

 Public Function IsTaskRunning(sWindowName As String) As Boolean
Dim hwnd As Long, hWndOffline As Long
   On Error GoTo IsTaskRunning_Eh
'get handle of the application
'if handle is 0 the application is currently not running
hwnd = FindWindow(0&, sWindowName)
If hwnd = 0 Then

IsTaskRunning = False

Exit Function
Else

IsTaskRunning = True
End If
IsTaskRunning_Exit:

Exit Function
IsTaskRunning_Eh:
Call ShowError(sWindowName, "IsTaskRunning")
 End Function
 Public Function EndTask(sWindowName As String) As Integer
Dim X As Long, ReturnVal As Long, TargetHwnd As Long
   'find handle of the application
TargetHwnd = FindWindow(0&, sWindowName)
If TargetHwnd = 0 Then Exit Function
   If IsWindow(TargetHwnd) = False Then

GoTo EndTaskFail
Else
'close application

If Not (GetWindowLong(TargetHwnd, GWL_STYLE) And WS_DISABLED) Then


X = PostMessage(TargetHwnd, WM_CLOSE, 0, 0&)


DoEvents

End If
End If
   GoTo EndTaskSucceed
EndTaskFail:
ReturnVal = False
MsgBox "EndTask: cannot terminate " & sWindowName & " task"
GoTo EndTaskEndSub
EndTaskSucceed:
ReturnVal = True
EndTaskEndSub:
EndTask% = ReturnVal
 End Function
 Public Function ShowError(sText As String, sProcName As String)   'this function displays an error that occurred
   Dim sMsg As String
sMsg = "Error # " & Str(Err.Number) & " was generated by " & Err.Source & vbCrLf & Err.Description
MsgBox sMsg, vbCritical, sText & Space(1) & sProcName
Exit Function
 End Function

Open in new window

This is the best money I have ever spent. I cannot not tell you how many times these folks have saved my bacon. I learn so much from the contributors.
rwheeler23
VBClassicGuy

Yes, Idle_Mind is indeed a legend, and a briliant programmer. The code I presented here was taken from his post, and slightly modified. I wish there was a way in EE to, if your answer is accepted and is taken from another member's answer somewherer else, to share points with that member, even if he has not contributed to the thread. That's hard to explain, but I think you know what I mean.
C0ding

ASKER

Thanks aikimark, i am kinda new here, and did not know that,
Next time i'll make sure i use that feature.

Note:
I'm sorry but i have not been able to come arround here since the day
when the site was under maintenance or something like that, cuz i did
but i keep seeing the "please try again later" or contact customer support.
and thats why i was away. SORRY.