[VB.Net] herstarten backgroundworker

Pagina: 1
Acties:
  • 700 views

Onderwerpen


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
hallo allemaal,

misschien een domme vraag maar ik kan werkelijk nergens vinden hoe ik fatsoenlijk een backgroundworker kan herstarten in vb.net. ik heb het volgende geprobeerd:
code:
1
2
3
4
5
        Me.BackgroundWorker1.CancelAsync()
        While BackgroundWorker1.IsBusy = True

        End While
        Me.BackgroundWorker1.RunWorkerAsync()

maar dan blijft het programma gewoon zonder melding hangen. als ik de while weglaat dan krijg ik de error dat de backgroundworker nog bezig is.

codering van de backgroundworker (mss belangrijk)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
        Dim procInfo As New ProcessStartInfo
        With procInfo

            ' Using working directory is recommended

            .WorkingDirectory = "C:\Users\Frank\AppData\Roaming\.minecraft\server"

            ' Give the full path and filename next

            .FileName = "C:\Users\Frank\AppData\Roaming\.minecraft\server\server_start.bat"

            .Arguments = ""

            .RedirectStandardOutput = True

            '.RedirectStandardInput = True

            .UseShellExecute = False

            .CreateNoWindow = True

        End With



        Dim proc As Process = Process.Start(procInfo)



        While proc.StandardOutput.Peek <> CInt(proc.StandardOutput.EndOfStream)

            sb.AppendLine(proc.StandardOutput.ReadLine)



            If backgroundWorker1.CancellationPending Then

                proc.Kill()

                e.Cancel = True

            End If

        End While


ik heb geen flauw idee hoe ik dit moet oplossen. heeft iemand een idee? of een goede denkrichting waarop ik verder kan bouwen? alvast hartelijk bedankt!

Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 04-09 18:51

DexterDee

I doubt, therefore I might be

Ik ben geen expert in VB.NET, maar volgens mij moet je eens kijken naar de DoWork en RunWorkerCompleted events. Op die manier kun je code hangen aan het eindigen van een background worker.

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Kan je niet beter eerst uit je while loop springen en dan je process killen?

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
eek schreef op zondag 06 november 2011 @ 14:06:
Kan je niet beter eerst uit je while loop springen en dan je process killen?
dat is idd wel een goed idee. ga ik even proberen

EDIT: werkt ook niet. het probleem is namelijk dat het programma de bat van de minecraft server start en dan alle output die deze bat geeft in een textbox stoppen. Op deze manier kan ik mijn programma laten reageren op wat er op de server gebeurt en commands laten geven. Maar het probleem is dat hij na ongeveer 15 regels stopt met het vangen van de output en daarom wil ik de backgroundworker laten herstarten. mss is het een beter idee om het hele backgroundworker idee te laten vallen en de code die de output vangt op een andere manier te loopen. Heeft iemand hier misschien een idee voor? Ik zal zelf even wat gaan proberen maar ideeën zijn altijd welkom!

EDIT2: ik weet geloof ik wat er fout gaat. de stream van het capture process stopt ermee na 15 regels. weet iemand hoe ik dit kan verhelpen?
nee toch niet. want als ik de server stop dan krijg ik een error op proc.kill genaamd toegang geweigerd en voert hij dus de code uit na de while. maar waarom stopt ie dan met het doorgeven van regels?

[ Voor 74% gewijzigd door williewonka03 op 06-11-2011 14:55 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
williewonka03 schreef op zondag 06 november 2011 @ 13:40:

code:
1
2
3
4
5
        Me.BackgroundWorker1.CancelAsync()
        While BackgroundWorker1.IsBusy = True

        End While
        Me.BackgroundWorker1.RunWorkerAsync()

maar dan blijft het programma gewoon zonder melding hangen
Je programma blijft niet hangen; dat zou je gezien hebben als je eens zou debuggen. Wat je hier hebt is een busy wait waardoor 't lijkt alsof je programma niet meer reageert.
williewonka03 schreef op zondag 06 november 2011 @ 13:40:
codering van de backgroundworker (mss belangrijk)
...
ik heb geen flauw idee hoe ik dit moet oplossen. heeft iemand een idee?
Met alle respect; heb je überhaupt een flauw idee waar je mee bezig bent? Afgaand op dit topic (en de vorige topics van je hand) lijkt het me verstandig als je eens stopt met copy/pasten van code die je op 't web of elders vindt en begint met 't (trachten te) begrijpen van waar je mee bezig bent. Je bent nu gewoon in 't donker met een honkbalknuppel in een porceleinwinkel op zoek naar die vervelende zoemende mug en je kunt je vast een beeld vormen hoe dat er uit gaat zien nadat je de mug te pakken hebt en iemand anders 't licht aan doet ;) Doe me een lol en doe zelf 't licht aan.

DexterDee wees je al in de juiste richting; je moet gaan kijken naar het RunWorkerCompleted event.
williewonka03 schreef op zondag 06 november 2011 @ 14:14:
Maar het probleem is dat hij na ongeveer 15 regels stopt met het vangen van de output en daarom wil ik de backgroundworker laten herstarten.
:X Ja, want code die er "spontaan mee kapt" trap je gewoon onderuit en herstart je weer :X (Overigens lijkt 't onderuit trappen van een process ook niet echt gewenst, maar ik ken heel minecraft dinges niet)
williewonka03 schreef op zondag 06 november 2011 @ 14:14:
maar waarom stopt ie dan met het doorgeven van regels?
Debuggen. Debuggen. DEBUGGEN. >> Debuggen: Hoe doe ik dat?
10 tegen 1 dat 't aan je busy wait ligt.

[ Voor 26% gewijzigd door RobIII op 06-11-2011 16:51 ]

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


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 04-09 18:51

DexterDee

I doubt, therefore I might be

RobIII schreef op zondag 06 november 2011 @ 16:43:
Debuggen. Debuggen. DEBUGGEN. >> Debuggen: Hoe doe ik dat?
10 tegen 1 dat 't aan je busy wait ligt.
Je hebt uiteraard gelijk, maar als de TS al moeite heeft met het design pattern van een background worker, dan ben ik bang dat multithreaded debugging helemaal een paar bruggen te ver is. Om ervaring op te doen is het beter om singlethreaded te beginnen tenzij het absoluut niet anders kan (ik ken minecraft niet).

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:29
Je roept CancelASync aan. Weet je wat die method doet, en doe je er dan iets mee ?

CancelASync gaat nl. enkel de CancellationPending property op True gaan zetten. Het is aan jou om in je 'work' method te gaan checken op die property, en als die op True staat, heb je de mogelijkheid om de taak die je aan het uitvoeren bent, op een propere manier te stoppen.

Echter, aangezien je volgens mij niet veel meer doet dan een process te starten, zit 'gracefull' afsluiten er niet echt bij. Je kan volgens mij niet veel meer doen dan dat process dan te killen.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
whoami schreef op zondag 06 november 2011 @ 18:28:
Je roept CancelASync aan. Weet je wat die method doet, en doe je er dan iets mee ?

CancelASync gaat nl. enkel de CancellationPending property op True gaan zetten. Het is aan jou om in je 'work' method te gaan checken op die property, en als die op True staat, heb je de mogelijkheid om de taak die je aan het uitvoeren bent, op een propere manier te stoppen.

Echter, aangezien je volgens mij niet veel meer doet dan een process te starten, zit 'gracefull' afsluiten er niet echt bij. Je kan volgens mij niet veel meer doen dan dat process dan te killen.
mm ok, maar als ik het process kill krijg ik
Error 1 Reference to a non-shared member requires an object reference
ik heb de error opgezocht maar snap niet zoveel van de officieele microsoft uitleg. ik zal wel ff verder zoeken. bedankt voor de tip!

EDIT: ik heb mijn programma op een andere manier gemaakt zonder de backgroundworker. bedankt voor alle tips! hier kan nu een slotje op ;)

[ Voor 6% gewijzigd door williewonka03 op 06-11-2011 18:42 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:29
williewonka03 schreef op zondag 06 november 2011 @ 18:37:
[...]

mm ok, maar als ik het process kill krijg ik

[...]

ik heb de error opgezocht maar snap niet zoveel van de officieele microsoft uitleg. ik zal wel ff verder zoeken. bedankt voor de tip!
Je roept een instance method als een static method aan.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Rayures
  • Registratie: Oktober 2001
  • Laatst online: 28-08 16:52
Wellicht een vreemde opmerkingen, maar is een threadpool ipv een backgroundworker misschien niet een betere keuze ?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je beseft dat je een topic van ruim 2 jaar oud schopt?

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

Pagina: 1

Dit topic is gesloten.