Hallo zusammen,
ich möchte gerne aus meiner .Net Anwendung nacheinander mehrere vbs-skripte starten. Dazu möchte ich gerne in meinem Programm eine gewisse Zeit warten, bis die Skripte beendet sind. Daher meine Frage. Gibt es im .Net Framework 1.1 eine Funktion die die Befehlsabarbeitung für eine gewisse Zeit anhält? Ähnlich wie es bei Threads die Methode Sleep(int milliseconds) gibt!
Wär echt super wenn mir da jemand helfen kann!
Danke schon mal!
Matthias
Hallo Matthias,
Threading.Thread.Sleep(millisecondsTimeout As Integer)
Gruß
Thomas
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hallo Matthias,
die gewünschte Antwort hast Du ja.
Die Lösung macht das Programm aber instabil, eine gute Lösung ist das nicht. Eine gute Lösung würde prüfen, ob das letzte Script noch läuft und auf das Ende warten.
Leider kenne ich mich mit .Net zu wenig aus, um Dir eine funktionierende Lösung anbieten zu können, das könnte ich nur mit VB6.
Eventuell findet sich ja noch Jemand, der weiß, wie man das mit .Net löst. Ich hatte gehofft, daß das bereits Teil der ersten Antwort wird.
Gruß, Rainer
Hallo zusammen,
danke für eure Antworten. Ich habe das mit Sleep ausprobiert und es funktioniert auch. Hier noch eine kleine Erläuterung zu meinem Programmablauf. Beim laden meiner Anwendung vergleiche ich das jetzige Datum mit dem Datum des letztes Abrufs aus der Datenbank. Ist die Differenz größer als 1 Tag werden nacheinander die Skripte angestoßen und Daten aus SAP exportiert. Ist die Differenz kleiner als 1 Tag passiert nichts. Ich weiß ja nicht in wie weit das ganze mein Programm instabil macht, da es ja nicht jedes mal aufgerufen wird.
@ Rainer: Wie würdest du es in VB6 machen? Vielleicht kann ich es ja auf .Net übertragen.
Hallo,
@ Rainer: Wie würdest du es in VB6 machen? Vielleicht kann ich
es ja auf .Net übertragen.
Das geht sicher auch noch kürzer, ich hatte aber gerade keine bessere Idee. 
Option Explicit
Const TH32CS\_SNAPHEAPLIST = &H1
Const TH32CS\_SNAPPROCESS = &H2
Const TH32CS\_SNAPTHREAD = &H4
Const TH32CS\_SNAPMODULE = &H8
Const TH32CS\_SNAPALL = (TH32CS\_SNAPHEAPLIST Or TH32CS\_SNAPPROCESS Or TH32CS\_SNAPTHREAD Or TH32CS\_SNAPMODULE)
Const TH32CS\_INHERIT = &H80000000
Const MAX\_PATH As Integer = 260
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String \* MAX\_PATH
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Function FindProcess(ByVal PID As Long) As Boolean
Dim hSnapShot As Long, uProcess As PROCESSENTRY32, r As Long
hSnapShot = CreateToolhelp32Snapshot(TH32CS\_SNAPALL, 0&:wink:
uProcess.dwSize = Len(uProcess)
r = Process32First(hSnapShot, uProcess)
Do While r
If uProcess.th32ProcessID = PID Then
FindProcess = True
End If
r = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
End Function
Private Sub Command1\_Click()
Dim PID As Long
PID = Shell("wscript.exe C:\Test.vbs", 1)
While FindProcess(PID) = True
Sleep 50
Wend
'Hier käme der nächste Aufruf
End
End Sub
Gruß, Rainer
Hallo!
Schau die einmal die Klasse System.Diagnostics.Process an. Hier auch zwei Links zum Lesen:
http://www.microsoft.com/germany/msdn/library/net/vb…
http://www.vbarchiv.net/archiv/tipp_1283.html
mfg
christoph
So,
ich habs jetz hinbekommen. Ich starte das skript als Prozess, lass mir die Id geben und prüfe in ner while-schleife ob dieser Prozess noch läuft! Funktioniert prima!
Vielen Dank für all eure Hilfe!
Matthias
Hi!
Mach doch nicht sowas
- BusyWait ist total out.
System.Diagnostics.Process hat doch die wunderschöne Methode WaitForExit()…
Gruß,
Martin
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Hast Recht Marten! Vielen Dank!
Habs jetz auch so gemacht. Is dann auch etwas schlanker!
Matthias