[C#] Invoke in Verbindung mit Sleep

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Ich habe eine kleine, aber für mich äusserst mühsame Frage bezüglich dem Thread.Sleep in einer Funktion drin.

Ich habe eine picturebox, die sich auf Tastendruck automatisch bewegen soll. Das alles ist kein Problem, allerdings ist das bisschen doof, wenn sie das in rasender Geschwindigkeit tut ;D

Daher habe ich mir überlegt, Thread.Sleep einzubauen. Da ich in Programmierung nicht unerfahren bin (C++), weiss ich natürlich, dass damit alles blockiert wird. Daher hab ich bisschen gegoogelt, was denn bei C# bezüglich des Threadings so gilt und bin auf folgenden Code gekommen:
Code:
//code, code, code ;D
Moving mov=new Moving(MoveAlong);
				Invoke(mov,picbox);
			}
		}
		
		delegate void Moving(System.Windows.Forms.PictureBox picer);
		
		void MoveAlong(System.Windows.Forms.PictureBox picer)
		{
			System.Drawing.Point point;
			point=picer.Location;
			while(point.X<=370)
			{
				point.X+=1;
				picer.Location=point;
                                Thread.Sleep(250);
			}
			this.panel1.Controls.Remove(picer);
		}

Das Problem ist nun, dass das nichts geändert hat. Der Hauptthread ist immernoch blockiert und nichts geschieht, bis das Ding entfernt ist, leider!

Hat jemand eine Ahnung, was da schief läuft?

Gruss
Cromon
 
Hallo Cromon,

ich kenne zwar den Code vor diesem Ausschnitt nicht, denke aber, dass die Invoke-Methode innerhalb Deines Hauptthreads ausgeführt wird. Da wäre es nicht verwunderlich, wenn der Hauptthread blockiert wird.
Stattdessen müsstest Du die Funktion in einen zweiten Thread auslagern, um den Hauptthread nicht zu behindern.

Über die System.Threading.Thread-Klasse lassen sich weitere Threads erstellen. Falls Du Fragen zur Erstellung von Threads in C# oder ähnlichem hast, kannst Du sie hier gerne stellen.

Gruß
PhoenixLoe
 
Achso, hm, stimmt, das macht Sinn. Ergo hab ich den Hinweis mit Invoke wohl falsch gelesen, ich dachte, Invoke würde einen neuen Thread erstellen, hat mich gewundert, aber war mir eigentlich ganz recht :D

Es via Thread zu machen, habe ich bereits probiert, allerdings da das Problem gehabt, dass mein delegat ja nicht vom Typ ThreadStart ist und daran dann gescheitert, daher habe ich mich nach anderen Mitteln umgesehen :)

Ich danke schon jetzt recht herzlich für die Hilfe und hoffe, dass ich auch noch den letzten kleinen Rest schaffe :)

Gruss
Cromon
 
Zurück