uendelig lykke uden crash

Tags:    c#

<< < 12 > >>
Hej.

jeg har et script der skal loopes fra man trykker på start, indtil man trykker på stop.

Eks.

While(active = true){

for(i=0;i<=10;i++){

kode

}
}

når man så trykker på stop knappen skal den sætte den tril false

men.. den går i crash, fordi det er en uendelig lykke.



12 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Du skal bruge en tråd til det, det ligger i namespacet System.Threading;

Grunden til at det går galt er at din uendelige løkke blokerer for processeringen af dit knap tryk.

hvis du har en metode:
void UendeligtLoop()
{
While(active){

for(i=0;i<=10;i++){

//kode

}
}
}

så mener jeg du kan lave tråden med:
Thread uendeligtraad = new Thread(UendligtLoop);

og du kan så starte den med
uendeligtraad.Start();

du skal dog være opmærksom på at du ikke må modificere din forms komponenter direkte, for at kunne modificere dem skal du bruge Invoke metoden der ligger i diverse visuelle komponenter, og det er lidt langhåret. Ellers får du en Exception.

God fornøjelse.




Du kan sagtens gøre det uden en tråd, du skal bare huske at processere windows messages en gang imellem. Det vil sige at du i din løkke skal huske at kalde

Application.PRocessMessages()

Tror jeg nok at den hedder



"uendelig lykke uden crash", lyder som min Linuxbox ;)



Fold kodeboks ind/udKode 


Jeg har lige lavet lidt kode til dig, som gerne skulle uddybe den "globale" boolean.

Da jeg nu lige var igang, viser jeg også, hvordan du kan undgå cross thead problemer, hvis du vil have tråden til at opdatere formen. En MessageBox kan kaldes uden problemer fra en tråd, men det kan formen ikke. Dette skyldes, at formen kører i en tråd, og hvis en alternativ tråd skal opdatere noget i formen, skal dette lige "aftales" med formtråden, så det kan ske, når den er parat (InvokeRequired er false).



Okay, jeg bruger allerede threading til sleep. og min funktion er i en metode.. Så prøver jeg lige at sige
Thread LoopFunction = new Thread(minMetode);
LoopFunction.Start();

Fold kodeboks ind/udKode 


Den siger at den ikke kan convertert void to System.Threading.ThreadStart



det er fordi du et eller andet sted forsøgerat returnere noget hvor du har specificeret void.



Dog er multithreading altid at foretrække, da du derved både giver bedre understøttelse for Multikernede CPU'er og generelt giver bedre processing af større datamængder :)



Fold kodeboks ind/udKode 


Hvis planen er at starte tråden i test og stoppe tråden i stop vil ovenstående kode ikke virke. Der er nemlig tale om to individuelle tråde. Du kunne alternativt bruge en "global" boolean, som er true når tråden skal køre, og som så sættes til false i stop.



Fold kodeboks ind/udKode 


Hvis planen er at starte tråden i test og stoppe tråden i stop vil ovenstående kode ikke virke. Der er nemlig tale om to individuelle tråde. Du kunne alternativt bruge en "global" boolean, som er true når tråden skal køre, og som så sættes til false i stop.


Okay, det ville jeg gerne du kunne uddybe lidt?



Jeg har nu fået lavet det på en anden måde

men den siger nu af fejl :
'MsnWidget.Form1.loopSendMessages(bool)': not all code paths return a value


Fold kodeboks ind/udKode 




<< < 12 > >>
t