Problem med at tegne i en tråd

Tags:    c#

Jeg er ved at lave en klasse der styrer en bold (i starten en ellipse) denne klasse har en metode der starter en tråd som så styrer bolden, problemet er at efter ca. 50 gennemløb fejler den med en illegal argument type, nogle, der kan hjælpe ??

public class Ball
{
#region Instance Variables
private float x_pos;
private float y_pos;
private float x_speed;
private float y_speed;
private static Graphics mainGraphics;

#endregion

public Ball(float startX, float startY, Graphics g)
{
x_pos=startX;
y_pos=startY;
mainGraphics=g;
}

#region Other methods

public void DrawBall()
{
Pen myPen=new Pen(Brushes.Black, 2);
while(2>1)
{
Console.WriteLine("x_pos: "+x_pos.ToString()+" y_pos: "+y_pos.ToString());
mainGraphics.DrawEllipse(myPen, x_pos, y_pos, 20, 20);
}
}

public void startBall()
{
Thread ballThread = new Thread(new ThreadStart(this.DrawBall));
Console.WriteLine("inde i tråd");
x_speed=1;
y_speed=1;
ballThread.Start();
while (!ballThread.IsAlive);

// Put the Main thread to sleep for 1 millisecond to allow ballThread
// to do some work:
Thread.Sleep(1);

}

#endregion

#region Properties

public float XPosition
{
get { return x_pos; }
set { x_pos=value; }
}

public float YPosition
{
get { return y_pos; }
set { y_pos=value; }
}

#endregion
}
}

OG her er fejlbeskeden:


x_pos: 100 y_pos: 100 //et gennemløb
x_pos: 100 y_pos: 100 //et andet gennemløb (ca. 50 af disse)
An unhandled exception of type 'System.ArgumentException' occurred in system.drawing.dll

Additional information: Invalid parameter used.

(¯`·._.·[Brian Hvarregaard]·._.·´¯)



5 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Jeg har leget lidt videre med det, det ser ud til at det er tråden der laver en fejl og ikke koden deri. Når jeg instantierer klassen gør jeg det således:

Ball myBall=new Ball(20,20,e.Graphics)
myBall.startBall();


Dette er nødvendigvis ikke den korrekte kode, men således gør jeg det med to linier....

(¯`·._.·[Brian Hvarregaard]·._.·´¯)

Hej Brian,

Din kode ser i og for sig fin ud men den Graphics instans du får fra dit paint event "lever" kun så længe du er inde i eventet.

Jeg har lavet et eks. som bruger din Ball klasse (dog ændret en smule) hvor Ball bliver oprettet i Paint eventet og kørt med det samme. Du kan så trykke på knappen "test" og Ball bliver kørt fra Button_Up eventet men med samme Graphics som kommer fra paint eventet. Du vil se at fejlen kommer så snart du trykker på knappen.
Fold kodeboks ind/udKode 


En mulighed kunne måske være at oprette en forkomst af Graphics i din Ball og der fra sende et event til din form som så tegner din Ball.Graphics på den aktuelle Graphics i Paint eventet (e.Graphics).

/Michael.



Jeg er ved at lave en klasse der styrer en bold (i starten en ellipse) denne klasse har en metode der starter en tråd som så styrer bolden, problemet er at efter ca. 50 gennemløb fejler den med en illegal argument type, nogle, der kan hjælpe ??


Jeg har personligt ikke meget forstand på hverken C# eller tråde i andet end Delphi, men du må da kunne finde ud af hvad det er for et argument der er "illegal"?


P.S. Tag at brug [ pre ] og [ / pre ] (uden mellemrum) til at indkapsle kode eksempler. Det gør det noget lettere at læse generelt.
--
Thomas Due
Software developer
udvikleren.dk - ASP redaktør
tdue@mail.dk


[Redigeret d. 12/01-04 22:54:24 af Thomas Due]



User
Bruger #635 @ 13.01.04 13:28
Kan du ikke lige prøve at skrive hvad du bruger for at instantiere din Ball classe

Evt prøv at sætte break points ind der hvor du tegner og
så brug watchen og kik hvad dine forskellige variabler har af værdi.



Jeg har leget lidt videre med det, det ser ud til at det er tråden der laver en fejl og ikke koden deri. Når jeg instantierer klassen gør jeg det således:

Ball myBall=new Ball(20,20,e.Graphics)
myBall.startBall();


Dette er nødvendigvis ikke den korrekte kode, men således gør jeg det med to linier....

(¯`·._.·[Brian Hvarregaard]·._.·´¯)



Hmmm.... jeg kigger på det, har overvejet at lave tråden i min main klasse i stedet det skulle gerne virke og så bruge den lokale Graphics i stedet for at sende den videre ti Ball klassen. Takker for hjælpen :-)

(¯`·._.·[Brian Hvarregaard]·._.·´¯)



t