Avatar billede anadan Nybegynder
22. august 2005 - 15:08 Der er 21 kommentarer og
2 løsninger

Call stack size

Jeg har et problem med StackOverflowException, men har problemer med at debugge det. er der en måde at få fat i størrelsen på min call stack? External kald velkomne.
Avatar billede arne_v Ekspert
22. august 2005 - 15:11 #1
medmindre du har nogle meget store value typer så plejer StackOverflowException
at betyde en uendelig rekursion
Avatar billede anadan Nybegynder
22. august 2005 - 15:26 #2
Jeg har ikke uendelig rekursion. Jeg har en liste med nogle items, og når jeg vælger et item så går der en proces igang, der kalder nogle metoder. Hvis jeg vælger et andet item skal den oprindelige stoppes, og den nye starte. Problemet er at den oprindelige ikke stopper.

Jeg har testet at hvis et item ikke når at blive færdigt og jeg vælger et nyt 11 (!) gange, så kommer min stackoverflow
Avatar billede anadan Nybegynder
22. august 2005 - 15:28 #3
Hvis jeg lader processerne afslutte kommer der ikke stackoverflow
Avatar billede spif2001 Nybegynder
22. august 2005 - 15:37 #4
er det tråde du sætter i gang? Hvis ja, så sæt dem til BackGround.

Thread t = new Thread(new ThreadStart(Run));
t.IsBackground = true;
Avatar billede anadan Nybegynder
22. august 2005 - 16:01 #5
Jeg bruger ikke tråde
Avatar billede driis Nybegynder
22. august 2005 - 17:20 #6
Har du en kodestump vi kan se ? Jeg kan ikke lige gennemskue præcist hvad det er du gør, hvis ikke du bruger tråde ?
Avatar billede anadan Nybegynder
22. august 2005 - 21:19 #7
Koden er ret kompliceret... Men her er en nærmere beskrivelse:

Jeg laver en app til en PDA, der skal vise artikler. Dele af teksten skal fremhæves, og da der ikke er noget Control til dette i .net compact, har jeg kodet den selv. Jeg har lavet en simpel parser der gør dette. Da artiklen skal vises så hurtigt som muligt, har jeg valgt at tegne artiklen samtidig med at applikationen kan modtage input. Tråde kan ikke tegne direkte, så jeg benytter mig af kaldet Application.DoEvents(), som jeg kalder hver gang jeg har tegnet et enkelt ord. Dermed kan jeg tegne med hovedtråden, og samtidig modtage events (det virker fremragende).

while(wordsToDraw){
  drawWord();
  Application.DoEvents();
}
Avatar billede anadan Nybegynder
24. august 2005 - 10:29 #8
ingen der ved det?
Avatar billede spif2001 Nybegynder
24. august 2005 - 10:34 #9
Der står i beskrivelsen af DoEvents() følgende:

CAUTION  Calling this method can cause code to be re-entered if a message raises an event.

lugter lidt af, som arne_v sagde, at der sker noget rekursivt.
Avatar billede spif2001 Nybegynder
24. august 2005 - 10:35 #10
Muligvis bliver der fyret events af bag linierne, som du ikke har kontrol over...
Avatar billede anadan Nybegynder
24. august 2005 - 10:36 #11
Det for klarer ikke hvorfor det ikke sker, hvis jeg lader dem arbejde færdigt, eller hvorfor det præcis er 11 gange
Avatar billede spif2001 Nybegynder
24. august 2005 - 10:43 #12
de 11 gange er åbenbart det der trigger StackOverflow - en (u)passende mængde data.

Hvis du lader dem arbejde færdig, for den åbenbart frigjort stack'en.

du sagde:
"Jeg har en liste med nogle items, og når jeg vælger et item så går der en proces igang, der kalder nogle metoder. Hvis jeg vælger et andet item skal den oprindelige stoppes, og den nye starte. Problemet er at den oprindelige ikke stopper."

det må jo ligge i, at du ikke får stoppet de processer ordentligt. Kan du vise koden til de metoder du bruger når du vælger et item og de(n) metode(r) du bruger til at stoppe den oprindelige process?
Avatar billede spif2001 Nybegynder
24. august 2005 - 11:01 #13
> So what exactly is risky with DoEvents()? The worst thing I can imagine is
> that the UI has slow response times, thats all.

Your stack gets deeper and deeper the more things which go on within
your DoEvents, possibly leading to a StackOverflow which is solely due
to simulating multiple threads within a single thread.

If you make *any* blocking calls, you are tying up your UI for a
potentially *very* long time - not just slow response times, but a
completely *unresponsive* UI.

You still have to work out which bits of code must execute in a sort of
"transactional" way without calling DoEvents again, in case the other
events will modify data you're relying on not changing.

See "On COM, pumping and the CLR" in
http://mikedimmick.blogspot.com/200...ck_archive.html
for some another example.

Fundamentally the usual problem is wanting to do more than one thing at
a time - and that's precisely what threads are designed to do.


Taget fra følgende tråd:

http://www.codecomments.com/archive291-2004-5-189121.html
Avatar billede anadan Nybegynder
24. august 2005 - 11:04 #14
Glimrende, men det løser jo stadig ikke problemet. Jeg kan jo ikke bruge tråde til at opdatere min GUI, så DoEvents() er den eneste løsning
Avatar billede spif2001 Nybegynder
24. august 2005 - 11:14 #15
hmmmm...

Har lidt svært ved at se mig ud af dit problem. Kan du ikke vise koden a la det jeg skrev før?
Avatar billede anadan Nybegynder
24. august 2005 - 11:24 #16
Hmm, jeg har 1600 linier i de to relevante klasser så det tror jeg ikke er en løsning. Desuden har jeg fundet ud af at det er mit flag CancelDrawing der sandsynligvis er problemet. Når jeg sætter Text bliver CancelDrawing sat til false, inden den anden når at stoppe. Jeg skal på en måde have et andet flag, StoppedDrawing, så min CancelDrawing ikke sættes til false før StoppedDrawing er true. Det er dog bare et problem, da jeg ikke kan while(!StoppedDrawing);, så jeg kun kører én tråd..

Jeg arbejder lige på det..
Avatar billede anadan Nybegynder
24. august 2005 - 13:33 #17
den sidste del skulle være ", da jeg kun kører en tråd.."
Avatar billede spif2001 Nybegynder
25. august 2005 - 13:33 #18
fik du løst problemet?
Avatar billede anadan Nybegynder
25. august 2005 - 15:37 #19
desværre :(

Men jeg er dog ved at have indset at de 11 gange man skal vælge for at bug'en kommer er så usandsynligt, at det nok aldrig vil ske i almindeligt brug. Desuden vil der nok snart komme en alternativ løsning til .net compact (RichTextBox, eller mulighed for at tegne direkte fra tråde).

Nogen der ved noget om disse alternativer?
Avatar billede anadan Nybegynder
29. september 2005 - 14:44 #20
Det er på tide at lukke, spif2001, hvis du vil have point, så smid et svar
Avatar billede spif2001 Nybegynder
30. september 2005 - 13:05 #21
Så stik mig et enkelt ;)
Avatar billede anadan Nybegynder
30. september 2005 - 13:09 #22
du er ikke meget for point i dag :D
Avatar billede spif2001 Nybegynder
30. september 2005 - 13:17 #23
hæh - hader bare selv at diktere hvor mange point jeg skal have - det må jo være op til spørgeren :)
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