Avatar billede naxosnaxos Nybegynder
03. februar 2003 - 23:47 Der er 32 kommentarer og
1 løsning

En tråd der ikke vil nedlægges...

Nu kører mine tråde, dog vil de ikke stoppe igen;)
Jeg har en tråd der bliver startet med en run() i min constructor på en form.
run(): her er min run.
listenThread = new Thread( new ThreadStart( startListening ) );
            listenThread.Start();

i startListening laver jeg så noget arbejde. Men hvordan nedlægger jeg den igen?? har prøvet abort, men jeg får ikke en exception som ventet på nedlukningen nogle hints??
Avatar billede websmith Nybegynder
03. februar 2003 - 23:51 #1
Man lukker ikke threads. De lukker sig selv.

Din run metode skal loope indtil din thread skal dø.

public void run()
{
  while(die==false)
  {
    //Gør dit arbejde.
  }


}

public void stop()
{
die=true;
}

dvs. du laver en class variable die og i din public metode stop sætter du die til true.

Når du så vil stoppe en thread som du har startet, så kalder du bare dinThread.stop();

Så skulle den selv stoppe og frigive ressourcer, når du har sat referencen til null;
Avatar billede naxosnaxos Nybegynder
04. februar 2003 - 00:05 #2
hmmm jeg synes ikke rigtig den lukkes. Hvis jeg helt udkommenter tråden lukker det hele fint, men når tråden er der går det ikke
Avatar billede naxosnaxos Nybegynder
04. februar 2003 - 00:11 #3
måske det er min TcpLIstener der bloker, nu er jeg sku i tvivl
Avatar billede burningice Nybegynder
04. februar 2003 - 11:14 #4
websmith>> jeg synes nu ellers mit program klarer det med at nedlægge threads helt fint...

i min constructer:

thrClock = new Thread(new ThreadStart(UpdateClockLabel));
thrClock.Start();

i min closing event:

private void frmMain_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    thrClock.Abort();
}
Avatar billede websmith Nybegynder
04. februar 2003 - 14:07 #5
Det er korrekt, men der lukker du jo også hovedapplikationen, så derfor bliver alle threads automatisk lukket.
Avatar billede burningice Nybegynder
04. februar 2003 - 14:24 #6
websmith>> det er kun fordi at jeg kalder thrClock.Abort(); at threads'ene bliver afsluttet...

hvis jeg fra en anden form kalder Application.Exit(), så lukker programmet, men bliver ved med at figurere som process i taskmanageren, fordi at der stadigvæk kører en thread.
Avatar billede naxosnaxos Nybegynder
04. februar 2003 - 15:25 #7
nemlig jeg kan også se det i taskmanager. Men jeg vil lige forsøge mig lidt mere. Jeg har min tråd hvor inde i at der kører en TcpListener, denne tror jeg skaber mit problem
Avatar billede naxosnaxos Nybegynder
04. februar 2003 - 16:21 #8
okay nu har jeg prøvet med stop på min tcp listener, men så får jeg en exception:

Unhandled Exception: System.Net.Sockets.SocketException: En blokeringshandling blev afbrudt af et kald til WSACancelBlockingCall
  at System.Net.Sockets.Socket.Accept()
  at System.Net.Sockets.TcpListener.AcceptSocket()
  at SharpClient.ClientServ.runListen() in c:\........\clientserv.cs:
line 93

her er min linie 93:

Socket newClient = tcpListener.AcceptSocket();
og der er endnu ingen klienter der er forbundet, hvordan dælen kan jeg så få en dejl ved at lukke min listener??
Avatar billede burningice Nybegynder
04. februar 2003 - 17:06 #9
hmm... lyder som en sag for simon... han har rodet meget med den tcp listener, endda skrevet sin egen da han ikke var tilfreds med den MS har lavet ;)
Avatar billede naxosnaxos Nybegynder
04. februar 2003 - 17:32 #10
jamen så må han jo joine vores samtale
Avatar billede naxosnaxos Nybegynder
04. februar 2003 - 17:55 #11
ahhh nu kører det vist. Jeg tror jeg fik lukket min applikation for hurtigt (Exit) så ikke alt blev frigivet ;) Er der forresten nogen af jer der har problemer med debuggeren i VS.NET?? min låser visual studio, hvis jeg laver run med debugger. Også hvis jeg vælger noger omkring debuggeren låser vs.net
Avatar billede burningice Nybegynder
04. februar 2003 - 18:08 #12
er ikke helt med på hvad du mener, når du siger at den fryser når du laver run... men hos mig virker det nu upåklageligt... eneste jeg har lidt svært ved at få til at køre ordenligt er når jeg skal debugge asp.net sider, men det overlever jeg nok.
Avatar billede websmith Nybegynder
04. februar 2003 - 19:50 #13
Jeg kan heller ikke debugge asp.net, men det er vist et serverproblem hos mig, men jeg kan sagtens debugge generelt.
Avatar billede websmith Nybegynder
04. februar 2003 - 19:51 #14
Og tak for point forresten, når det nu ikke kunne bruges :)
Avatar billede simon.ulsnes Nybegynder
04. februar 2003 - 23:12 #15
naxosnaxos >>
Det er en del nemmere at anvende ThreadPool.QueueUserWorkItem(new WaitCallback(thread), etobjekt); til multithreading, omend man har knap så meget kontrol over den enkelte tråd. Så kan trådene bedre selv styre hvornår de lukker sig og sådan. Min TcpListener som cyberfessor omtaler bruger dette til at kunne modtage mange klienter på samme tid - hvis du har lyst, kan jeg sende dig koden så du kan kigge lidt på den...
Avatar billede naxosnaxos Nybegynder
05. februar 2003 - 20:25 #16
meget gerne...
Avatar billede simon.ulsnes Nybegynder
05. februar 2003 - 20:40 #17
Smid en mailadresse...
Avatar billede naxosnaxos Nybegynder
05. februar 2003 - 21:14 #18
rasmus_aarhus@hotmail.com det hjælper nok en del ;o)
Avatar billede naxosnaxos Nybegynder
05. februar 2003 - 21:50 #19
tak for mailen den vil jeg kigge på snart ;o). Først vil jeg have lukket min egen TcpListener. den  vil bare lave en exception, når jeg laver en stop på den.
Avatar billede naxosnaxos Nybegynder
05. februar 2003 - 21:56 #20
Og dne vil stadig ikke stoppes ;o) den klager stasig som tidligere skrevet over at en blokerings handling blev afbrudt. Så jeg går ud fra at den kører som blocking. men hvordan dælen afbryder man den ellers??

min tråds run func:

while( true )
{
  lytter
}
Avatar billede websmith Nybegynder
05. februar 2003 - 22:15 #21
Du kunne jo prøve som jeg forslog, det kan jo være at det virker. På den måde kan du jo få den til at exite fra din run metode.
Avatar billede naxosnaxos Nybegynder
05. februar 2003 - 22:56 #22
jeg synes det er lige meget hvad jeg gør så kommer den exception på min TcpListener. Men som med tråde får man jo en exception ved kald af .abort
Avatar billede naxosnaxos Nybegynder
05. februar 2003 - 23:11 #23
dette er min run på den tråd der skal lytte:

private void startListen()
        {
            try
            {
                while( true )
                {
                    Socket newClient = tcpListener.AcceptSocket();
                    if( newClient.Connected )
                    {
                        ClientHandler newClientHandler = new ClientHandler( newClient );
                        Application.Run( newClientHandler );   
                    }
                }
            }
            catch( SocketException socEx )
            {
                MessageBox.Show( "Error in listenThread: "+socEx.Message );
            }
        }

hvordan bør jeg stoppe tråden samt TcpListeneren uden fejl
Avatar billede burningice Nybegynder
06. februar 2003 - 09:03 #24
hmm... burde du ikke lave lidt om i din while-løkke...

private void startListen()
        {
            bool start = true
            try
            {
                while( start )
                {
                    Socket newClient = tcpListener.AcceptSocket();
                    if( newClient.Connected )
                    {
                        ClientHandler newClientHandler = new ClientHandler( newClient );
                        Application.Run( newClientHandler );   
                    }
                }
            }
            catch( SocketException socEx )
            {
                MessageBox.Show( "Error in listenThread: "+socEx.Message );
            }
        }

For at stoppe den sætter du start til false... så vil din while-løkke jo automatisk stoppe, og vupti... din listener er... stoppet... ;)
Avatar billede simon.ulsnes Nybegynder
06. februar 2003 - 15:15 #25
Præcis, jeg mener også det er sådan jeg har gjort med min egen listener...
Avatar billede naxosnaxos Nybegynder
06. februar 2003 - 22:23 #26
ja udover at jeg nok skal oprette start uden for metoden, da den ellers er lidt svært at sætte til false...
Avatar billede naxosnaxos Nybegynder
06. februar 2003 - 23:11 #27
hmm hmmm hmmmmmm aghh hjf89q32 nu er det for underligt.
JEg har ændret min while, så den arbejder på true/false. Men selv om jeg ændrer den til false, så wile lækken brudes, kommer den ikke rigtig ud. tcpListener processen kører stadig. og hvis jeg nu laver en stop på den laver den blot en exception. Er der ikke en der kan prøve at teste det og se om der er samme fejl??
Avatar billede naxosnaxos Nybegynder
06. februar 2003 - 23:22 #28
jeg har så lige erfaret at hvis jeg sætter min while variable til false, stoper den som skrevet ikke tcplistener, men hvis jeg derefter connecter med en client, lukker denne ryger jeg ud af løkken og listeneren bliver nedlagt. Det er som om den vil have mindst en connection før dens blokerings tilstand kan brydes
Avatar billede naxosnaxos Nybegynder
06. februar 2003 - 23:40 #29
ok er nu løst ved at angive at tråden som min tcplistener kører i er isBackground = true;  Ved ikke om dette er en naturlig forklaring
Avatar billede simon.ulsnes Nybegynder
07. februar 2003 - 07:21 #30
Efter dit while-loop kan du også skrive:
Thread.CurrentThread.Abort();
Bare for en ordens skyld...
Avatar billede burningice Nybegynder
07. februar 2003 - 08:55 #31
naxosnaxos>> lyder weird, men mon ikke der er en "naturlig" forklaring på det, hvis man begynder at grave i dokumentationen ;) godt at du endelig fik det til at virke :)
Avatar billede nielsbrinch Nybegynder
18. oktober 2003 - 20:57 #32
Det er ikke det mindste underligt.

Jeg sidder med præcis det samme problem. Jeg lytter efter en besked på netværket i en while-løkke på præcis samme måde, og den nedlægges heller ikke.

Grunden er at tråden jo først nedlægges når arbejdet i løkken er gjort færdigt. At man sætter while-variablen til false får den ikke til at hoppe ud løkken, men gør blot at den ikke starter forfra på løkken næste gang. Men der er ikke nogen næste gang, hvis man ikke modtager noget.

At sætte while(false) virker altså ikke, når det inde i løkken er en metode der blokerer.
Avatar billede naxosnaxos Nybegynder
19. oktober 2003 - 11:59 #33
time to close mit spg. fik jeg vist svar på, men der er ingen at give point, så først til mølle....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester