Hoi,
Ik ben een progje aan het kloppen dat kortgezegd het volgende doet:
Controlleert via een timer of er scripts in een voorgedefinieerde map staan, en voert deze scripts een voor een uit tot alle scripts verwerkt zijn. Scripts worden na verwerking verwijderd.
Het probleem:
Indien er een fout in het script zit kan dit een lange tijd duren voordat er een reply van de functie komt die het script als process runt. Zolang het form op een reply van dit process wacht blijft het mainform hangen.
Ik heb geprobeerd dit hangen op te lossen met DoEvents maar dit bracht geen enkele voortuitgang (sterker nog, het maakte geen enkel verschil waar ik de doevents neerzet in de code). Nu heb ik het process in een thread draaien en draait het prima, maar is er een ander probleem (ehm.. lees uitdaging) naar voren gekomen.
Gezien mijn thread niets meer doet dan een functie uitvoeren, en ik deze functie vaker uit moet voeren, wil ik eigenlijk de thread "herstarten". Nu heb ik een beetje zitten googlen en blijkt dat dit wordt afgeraden en nogal problematisch is. Ik zou graag weten of iemand een alternatief weet of een methode om voor mijn situatie de functie herhaaldelijk uit te voeren zonder dat mn mainform zich ophangt.
Dit is de code van het process (alle variabelen zijn globaal binnen de module dus de functie zelf geeft geen output.:
================================================================
Public Function ProcessThread()
Dim ProcessError As String
Dim objProcess As New Process()
objProcess.StartInfo.FileName = "cscript"
objProcess.StartInfo.UseShellExecute = False
objProcess.StartInfo.CreateNoWindow = True
objProcess.StartInfo.RedirectStandardOutput = True
objProcess.StartInfo.RedirectStandardError = True
objProcess.StartInfo.Arguments = ProcessPath & " //NoLogo"
objProcess.Start()
Dim sOut As StreamReader = objProcess.StandardOutput()
Dim sErr As StreamReader = objProcess.StandardError()
ProcessError = sErr.ReadToEnd
If ProcessError = "" Then
ErrorCode = 0
Else
ErrorCode = 1
ScriptError = ProcessError
End If
If Not objProcess.HasExited Then
objProcess.Kill()
End If
sOut.Close()
sErr.Close()
objProcess.Close()
End Function
================================================================
Ik ben een progje aan het kloppen dat kortgezegd het volgende doet:
Controlleert via een timer of er scripts in een voorgedefinieerde map staan, en voert deze scripts een voor een uit tot alle scripts verwerkt zijn. Scripts worden na verwerking verwijderd.
Het probleem:
Indien er een fout in het script zit kan dit een lange tijd duren voordat er een reply van de functie komt die het script als process runt. Zolang het form op een reply van dit process wacht blijft het mainform hangen.
Ik heb geprobeerd dit hangen op te lossen met DoEvents maar dit bracht geen enkele voortuitgang (sterker nog, het maakte geen enkel verschil waar ik de doevents neerzet in de code). Nu heb ik het process in een thread draaien en draait het prima, maar is er een ander probleem (ehm.. lees uitdaging) naar voren gekomen.
Gezien mijn thread niets meer doet dan een functie uitvoeren, en ik deze functie vaker uit moet voeren, wil ik eigenlijk de thread "herstarten". Nu heb ik een beetje zitten googlen en blijkt dat dit wordt afgeraden en nogal problematisch is. Ik zou graag weten of iemand een alternatief weet of een methode om voor mijn situatie de functie herhaaldelijk uit te voeren zonder dat mn mainform zich ophangt.
Dit is de code van het process (alle variabelen zijn globaal binnen de module dus de functie zelf geeft geen output.:
================================================================
Public Function ProcessThread()
Dim ProcessError As String
Dim objProcess As New Process()
objProcess.StartInfo.FileName = "cscript"
objProcess.StartInfo.UseShellExecute = False
objProcess.StartInfo.CreateNoWindow = True
objProcess.StartInfo.RedirectStandardOutput = True
objProcess.StartInfo.RedirectStandardError = True
objProcess.StartInfo.Arguments = ProcessPath & " //NoLogo"
objProcess.Start()
Dim sOut As StreamReader = objProcess.StandardOutput()
Dim sErr As StreamReader = objProcess.StandardError()
ProcessError = sErr.ReadToEnd
If ProcessError = "" Then
ErrorCode = 0
Else
ErrorCode = 1
ScriptError = ProcessError
End If
If Not objProcess.HasExited Then
objProcess.Kill()
End If
sOut.Close()
sErr.Close()
objProcess.Close()
End Function
================================================================