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

[VB.NET 2005] Restarten van thread's

Pagina: 1
Acties:
  • 187 views sinds 30-01-2008
  • Reageer

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 21-10 21:48
Situatie:

Applicatie dient meerdere taken tegelijk uit te voeren, en kunnen onafhankelijk van elkaar werken. Dus direct bij de form load van form_main worden de processen gestart.

Echter wil ik de mogelijkheid hebben om een proces te kunnen herstarten, dus niet pauzeren en verder gaan, maar een Abort uitvoeren en een restart.

Alleen met Abort en Start kom je er niet mee, omdat een aborted thread niet opnieuw kan worden gestart.
Visual Basic:
1
2
3
4
Variabele.Abort
Variabele = Nothing
Variabele = New Thread(New ThreadStart(AddressOf Grace.Form_Main.RecieveLoop))
Variabele.Start


Dit geeft het probleem dat bij het afsluiten het thread niet wordt gestopt. Afijn dus ook nog eens
Visual Basic:
1
Variabele.IsBackground = true.

Maar het thread blijft gewoon lopen.

Enig idee wat hier de oorzaak van kan zijn ?

[ Voor 4% gewijzigd door fleppuhstein op 01-10-2007 15:50 ]


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Threads kun je niet zomaar stoppen en weer starten. Abort op een thread heeft dezelfde werking als een 'end process' op een applicatie in de task manager. Windows slaat de opstandige thread met harde hand neer.

Echter kun je wel een herstart simuleren. Via een ParameterizedThreadStart kun je een object als argument meegeven. Als je in dat object een 'Start' property implementeerd kun je vanuit de 'controller' dan de thread aansturen. Zolang de start property 'true' is blijft de thread in een loop. Op het moment dat start false wordt, wordt de loop verlaten en zal de thread stoppen. Het beste kun je daarom met een queue object werken. Via de destructor zou je de queue collectie kunnen opslaan in bijv. een database of serialiseren naar harde schrijf. De eerst volgende keer dat je de thread start controlleer je of er nog een queue 'open' staat.

Maar aan je vraag te merken is het denk ik heel erg verstandig dat je je eerst goed inleest betreffende thread programming en asynchroon toegang tot collecties. Je zult thread-safe moeten gaan werken.

If it isn't broken, fix it until it is..


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
De oplossing uit je topic start en dan de runnende threads gewoon bij afsluiten even netjes killen?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 21-10 21:48
riezebosch schreef op maandag 01 oktober 2007 @ 16:36:
De oplossing uit je topic start en dan de runnende threads gewoon bij afsluiten even netjes killen?
Dat doe ik maar toch blijft er een thread draaien. Als deze een restart heeft gekregen. Zelfs bij een Abort. Deze abort ook uitgevoerd met Try Catch en er komt geen error message uit.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 28-11 08:35

curry684

left part of the evil twins

Hiervoor hebben ze ook gracieuze oplossingen bedacht, namelijk iets met "thread synchronization". Oftewel in je thread loops regelmatig checken of er al een stop-request is (met een Event object gaarne, niet een gewoon unsafe variable), en vanuit de main thread wachten tot alle threads uit zichzelf gekapt zijn.

Killen of aborten is nooit een oplossing.

Professionele website nodig?


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
fleppuhstein schreef op dinsdag 02 oktober 2007 @ 15:21:
[...]

Dat doe ik maar toch blijft er een thread draaien. Als deze een restart heeft gekregen. Zelfs bij een Abort. Deze abort ook uitgevoerd met Try Catch en er komt geen error message uit.
Bij dit kleine testje:
C#:
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
    class Program
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(asdf);
            t.Start();

            while (Console.ReadKey().Key != ConsoleKey.Escape)
            {
                t.Abort();

                t = new Thread(asdf);
                t.Start();
            }

            t.Abort();
        }

        static void asdf()
        {
            Console.WriteLine("Thread started: {0:HH:mm:ss}", DateTime.Now);
            Random r = new Random();

            while (true)
            {
                Console.Write(r.Next(9));
                Thread.Sleep(500);
            }
        }
    }


lijkt het toch echt te werken. Ik start hem dan wel vanuit CMD, omdat anders wel het VSHOST proces actief blijft maar volgens mij is dat Visual Studio die dat doet en heeft het niets met je eigen threads te maken.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:14
Jah... ik denk niet dat je dergelijke code echt wilt.
Ten eerste is een thread starten relatief duur; ten tweede, als je een thread gewoon abort ... maar dit is al gezegd zie ik...

Wat als je thread een atomaire actie moet uitvoeren ?

Maar goed, blijkbaar vinden sommige mensen dat helemaal niet belangrijk.

https://fgheysels.github.io/


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 31-10 11:58
whoami schreef op dinsdag 02 oktober 2007 @ 16:41:
Jah... ik denk niet dat je dergelijke code echt wilt.
Ten eerste is een thread starten relatief duur; ten tweede, als je een thread gewoon abort ... maar dit is al gezegd zie ik...

Wat als je thread een atomaire actie moet uitvoeren ?

Maar goed, blijkbaar vinden sommige mensen dat helemaal niet belangrijk.
Oh, ik had de reactie curry684 gemist (tegelijk gepost) :)

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack

Pagina: 1