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

[c#] code springt heen en weer

Pagina: 1
Acties:

Verwijderd

Topicstarter
hey, misschien is iemand van jullie al een soortgelijk probleem tegengekomen en kan me helpen dit op te lossen. ik heb een applicatie die op een bepaald moment een reeks berekeningen uitvoert op een 2 dimensionele array, de eerste keer dat het algoritme loopt gaat alles meestal goed, de tweede keer begint de code echter "heen en weer te springen" (zoals ik kon zien door de code stap voor stap uit te voeren).

dus vereenvoudigt:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
            float sunMin = getMinimumBrightness((System.Drawing.Bitmap)bmp.Clone());
            float sunMax = getMaximumBrightness((System.Drawing.Bitmap)bmp.Clone());
            float SUNDISC_TRESHOLD_LOW = getTresholdLow(sunMin, sunMax);
            float SUNDISC_TRESHOLD_HIGH = getTresholdHigh(sunMin, sunMax);

            float totMaxedDifferences = 0f;
            float countedPixels = 0;
            bool foundTop;
            bool foundBottom;

            for (int x = 2; x < bmp.Width - 2; x++)
            {
                foundTop = false;
                foundBottom = false;

                int y = 2;
                while (!(foundTop && foundBottom))
                {
                    int y1 = y;
                    int y2 = bmp.Height - y - 1;

                    if (!foundTop)
                    {
                        float val1 =
                            (float)((bmp.GetPixel(x - 2, y1 - 2).GetBrightness() 
                                    .... knip sommatie ....
                                           ) / 25);
                        if ((val1 > SUNDISC_TRESHOLD_LOW) && (val1 < SUNDISC_TRESHOLD_HIGH))
                        {                            
                            float maxDif = ... knip sommatie ...
                            totMaxedDifferences = totMaxedDifferences + maxDif;
                            countedPixels++;
                            //bmp2.SetPixel(x, y, System.Drawing.Color.Pink);
                        }
                        if (val1 > SUNDISC_TRESHOLD_HIGH)
                        {
                            foundTop = true;
                        }
                    }
                    if (!foundBottom)
                    {
                        float val2 =
                            (float)((bmp.GetPixel(x - 2, y2 - 2).GetBrightness() 
                                    .... knip sommatie ....
                                           ) / 25);
                        if ((val2 > SUNDISC_TRESHOLD_LOW) && (val2 < SUNDISC_TRESHOLD_HIGH))
                        {
                            float maxDif = .... knip sommatie ...
                            totMaxedDifferences = totMaxedDifferences + maxDif;
                            countedPixels++;
                        }
                        if (val2 > SUNDISC_TRESHOLD_HIGH)
                        {
                            foundBottom = true;
                        }
                    }
                    y++;
                    if (y == bmp.Height / 2) { foundBottom = true; foundTop = true; }
                }
            }


hij loopt alles netjes door en dan gaat hij plots van opdracht 4 naar 2 dan naar 6 terug naar 3, en hop terug normaal en dan spring spring hop hop tot hij natuurlijk ergens een Invalid Access of een null-reference tegenkomt.

iemand een idee wat dit gedrag kan veroorzaken en hoe het te verhelpen ?

Edit: iets meer code, heb er enkele lange sommaties uitgeknipt

Edit2: Nog voor de volledigheid - Visual Studio 2008 met .Net 2.0

[ Voor 63% gewijzigd door Verwijderd op 19-12-2007 11:38 ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Laat eens wat relevante code zien, met vereenvoudigde code kunnen we weinig :)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Heb je niet meerdere threads lopen? Dat zou namenlijk wel verklaren waarom je in de debugger vreemde dingen tegen kunt komen.

Het lijkt me vreemd dat de execution volgorde anders is dan dat je geschreven hebt. Dat zou wel een hele aparte bug zijn dan.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op woensdag 19 december 2007 @ 11:19:
Heb je niet meerdere threads lopen? Dat zou namenlijk wel verklaren waarom je in de debugger vreemde dingen tegen kunt komen.

Het lijkt me vreemd dat de execution volgorde anders is dan dat je geschreven hebt. Dat zou wel een hele aparte bug zijn dan.
daar heb ik ook aan gedacht, maar er loopt maar 1 thread die deze functie aanspreekt, hetgene wat ik zeker bizar vind is dat het de eerste keer voor een reeks van x afbeelding werkt, als ik het dan opnieuw start voor een nieuwe reeks afbeeldingen begint het door te slaan (en mijn gebruikers zeggen dat ze het programma moeten her-opstarten is niet echt een optie :))

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11 13:15

Korben

() => {};

Misschien dat er ergens unmanaged code wordt gebruikt, wat een stack corruption zou kunnen veroorzaken. Dat zou m.i. de enige verklaring voor dit vreemde gedrag zijn.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Hoe ziet de code die de functie aanroept eruit. Ik denk toch dat er meerdere threads ( onbewust ) in het spel zijn.

Stack Corruption lijkt mij erg ver gezocht.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
Mijn eerste idee is hetzelfde als dat van rwb.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Blijkbaar is er inderdaad een probleem met de threads, als ik op de knop "Start" druk creeert hij de thread die ik hierboven vermeld, die thread wordt netjes vernietigd na uitvoering. Zo ver zo goed. Nadere inspectie toont me echter dat bij de tweede keer dat de knop wordt ingedrukt de code achter deze knop tweemaal wordt uitgevoerd en er dus inderdaad 2 threads lopen die hetzelfde proberen te doen.

De te uit te voeren code werd on-the-fly toegevoegd aan de Start knop omdat er afhankelijk van enkel paramters een verschillende methode moest worden gelinkt aan die knop. Dus met
code:
1
this.butGrab.Click += new System.EventHandler(this.butGrabBestImage_Click);

Doordat die lijn opnieuw werd aangeroepen bij het opnieuw tonen van de Start knop hingen er dus 2 eventhandlers aan. Heb dit opgelost door een private variable te maken van die eventhandler zodat ik met
code:
1
2
this.butGrab.Click += eventGrab;
 en this.butGrab.Click -= eventGrab;

mijn knopje terug vrij maak.

Probleem dus opgelost, alhoewel ik de Threads al eens had bekeken hebben jullie me toch aangezet om het toch nog dieper te gaan bekijken :)

En zoals altijd een pietluttig detail dat 500 lijnen verderop een probleem veroorzaakt

[ Voor 51% gewijzigd door Verwijderd op 19-12-2007 12:34 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je hoeft niet perse een private variabele te maken als je in .NET 2.0 werkt je kan ook gewoon doen

C#:
1
2
butGrab.Click += butGrabBestImage_Click;
butGrab.Click -= butGrabBestImage_Click;


Je hoeft hier niet zelf expliciet een eventhandler delegate van te instantieren. Dit gebeurt sinds .net 2.0 impliciet.

Op zich niks mis met jouw oplossing, maar even ter informatie

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1