Avatar billede orca Nybegynder
28. juni 2006 - 07:04 Der er 4 kommentarer og
1 løsning

Problemer med OnPaint

Jeg har en Form hvori jeg overrider OnPaint for at tegne en GUI. Formen invalideres af en timer som kører i et vilkårligt interval, som standard hver 100ms - hvorved OnPaint invokes igen.

Jeg har stødt ind i følgende bug op til flere gange undervejs:
http://www.webmentor.dk/bug.jpg

Det virker til at være meget tilfældigt når det sker. Jeg har oplevet at det er sket ved at jeg har tilføjet en linie kode så som MessageBox.Show(myComboBox.SelectedText) i en button hvis kode aldrig eksekveres. Omvendt så virkede det hvis jeg forsøgte at bruge .SelectedValue - igen, koden blev IKKE kørt, så det undrer mig meget hvilken indflydelse det har.

Nuvel, jeg undgik at bruge en combobox hvorved jeg undgik buggen. Nu er den dog begyndt at komme mere og mere, især hvis min OnPaint er tung at trække, dvs. at jeg laver en masse langsomme udregninger deri. Det er ikke fordi at den tidligere OnPaint ikke er færdig med at tegne førend den bliver kaldt igen, det har jeg tjekket for.

Jeg får ingen exceptions ved runtime, og ingen compile fejl/warnings.

Nogen der kan sige mig hvorfor det sker, og endnu bedre, hvad jeg gør for at undgå problemet?
Avatar billede bitsch Nybegynder
28. juni 2006 - 11:00 #1
Du bliver nok nødt til at vise lidt kode.
Ikke fordi jeg tror at det har betydning for det aktuelle problem, men hovedregelen er at man aldrig lægger beregninger i OnPaint hvis det kan undgås! OnPaint skal kun tegne.
Avatar billede Syska Mester
28. juni 2006 - 13:11 #2
Hvorfor har du den til at køre hvert 100 ms...?

OnPaint skal jo kun køres hver gang formen skal tegnes igen, og ikke et bestemt interval, sådan har jeg i hvert fald forstået det....

og gerne lidt koden og mere forklaring på hvad du vil opnå....

// ouT
Avatar billede orca Nybegynder
28. juni 2006 - 17:31 #3
Jeg kører en simulation af en algoritme i mit program. Der køres et 'step' af denne algoritme hvert 100ms som standard, dvs. hvert 100ms er algoritmedataene opdateret hvorefter formen skal tegnes igen - hvorfor jeg invaliderer form området således at OnPaint kaldes og derved tegner. Beregningerne er geometriske beregninger som er nødvendige for at tegne algoritmedataene, ikke noget jeg kan undvære. Det er vigtigt at pointere at performance er komplet ubetydeligt i dette case.

Som sagt så får jeg ingen exceptions whatsoever, og ingen compiler fejl, dvs. jeg har ikke kunnet finde et desideret problem i koden. Ligeledes kan jeg fremprovokere denne røde kryds fejl i flere underlige situationer, f.eks. den beskrevne hvor jeg ændrer noget kode som hverken bliver kørt eller har nogen somhelst indflydelse på noget. Senest har jeg fremprovokeret den i min OnPaint efter jeg har tilføjet følgende kodestump:

Dictionary<PointF, List<PointF>> connections = new Dictionary<PointF, List<PointF>>();

Ant ant = world.Nests[0].Ants[0];
for(int i=0; i<ant.Points.Count; i++)
{
    connections.Add(ant.Points[i], new List<PointF>());

    for(int j=0; j<ant.Points.Count; j++)
    {    if (i != j)
        {
            if (world.CanMoveTo(ant.Points[i], ant.Points[j]).Equals(ant.Points[j]))
            {
                connections[ant.Points[i]].Add(ant.Points[j]);
            }
        }
    }
}

DijkstraResult result = Dijkstra.Run(connections, ant.Location, ant.Nest.Location);

Det er en 100% standard implementation af Dijkstra's algoritme (som er testet og virker i andre applikationer). Datamængden har ingen betydning, nogle gange opstår krydset ved n=1, andre gange ved n=1000+.
Avatar billede orca Nybegynder
02. juli 2006 - 02:54 #4
Det viste sig at der grundet afrundingsfejl opstod en exception i koden, hvorfor denne exception så ikke formønter sig i hverken VS.NET Debugger loggen eller som en normal exception det forstår jeg så ikke.
Avatar billede Syska Mester
04. juli 2006 - 19:42 #5
meget mærkeligt, men godt at du fik det løst :-)

// ouT
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