Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Alternatief voor Threads gezocht (VB.NET)

Pagina: 1
Acties:

Verwijderd

Topicstarter
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

================================================================

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Pssst; code tags ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:08
Gebruik een BackGroundWorker.
Dat is eigenlijk een class die gebruikt maakt van Threading om een method op een andere thread uit te voeren. Het 'schermt' je ook af van evt cross-thread problemen als je de vooruitgang van je taak wilt tonen etc...
En als je de method nog eens uitvoert, dan wordt het afaik gewoon op een nieuwe Thread gestart.

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 20-11 23:37

TeeDee

CQB 241

Wat je kan doen is de FileSystemWatcher gebruiken om de map te controleren op scripts.
Dan gaat deze aan de slag. Is minder omslachtig dan een Timer in dit geval.
Vervolgens in het FileSystemWatcher_Changed event je Method aanroepen in de thread.
Waarom je thread wil herstarten is mij nog een raadsel eigenlijk.

Kijk ook eens voor de gein naar BackGroundWorker.

edit:
argh, met whoami dus...

[ Voor 12% gewijzigd door TeeDee op 14-01-2008 15:34 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:08
Met TeeDee trouwens wat betreft de FileSystemWatcher...

https://fgheysels.github.io/


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Verwijderd schreef op maandag 14 januari 2008 @ 15:25:
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.
Precies. Dus maak je niet druk en gebruik gewoon 1 thread per script.

Jouw enige bezwaar lijkt je intuïtie. Je hebt bij het googlen zelf al ontdekt dat je intuïtie niet betrouwbaar genoeg is (intuïtie is niets anders dan ervaring die je niet onder woorden kunt brengen). In dit geval moet je dus ook niet op je intuïtie afgaan; de overhead van een thread starten is verwaarloosbaar.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1