Thread Problem

yan1

Erfahrenes Mitglied
Hi,

ich muss in meinem Programm eine Anfrage über das Internet schicken und bekomme als integer wert zurück, wann ich die nächste Anfrage schicken darf.

private int anfrage(string frage);

Jetzt habe ich eine GUI wo immer angezeigt wird, in wievielen Sekunden die nächste Anfrage geschickt wird.

Ich wollte das ganze so lösen:

csharp Code:
  1. int zeit = anfrage ("anfrage);
  2. for (int i = 0; i < zeit; i++)
  3. {
  4. this.myLabel.Text = "Noch " + ( (int)(zeit - i)).ToString() + "sek. bis zur nächsten Anfrage";
  5. this.Update();
  6. Thread.Sleep(TimeSpan.FromSeconds(1));
  7. }


das funktioniert aber nicht, da sich die Windows Form dann aufhängt, e klar eigentlich.

dann hab ich mir gedacht - tja... es gibt ja sowas wie Threads, ich kenn mich damit nicht wirklich aus, aber ich weiß, wie man einen neuen Thread erzeugt und startet *g*

dann hab ich das gemacht:

csharp Code:
  1. private myMethod()
  2. {
  3. Thread thread = new Thread(this.threadStart());
  4. thread.Start();
  5. }
  6. void threadStart()
  7. {
  8. int zeit = anfrage ("anfrage);
  9. for (int i = 0; i < zeit; i++)
  10. {
  11. this.myLabel.Text = "Noch " + ( (int)(zeit - i)).ToString() + "sek. bis zur nächsten Anfrage";
  12. this.Update();
  13. Thread.Sleep(1);
  14. }
  15. }


Das funktioniert aber auch nicht, weil ich nicht auf this.myLabelText.Text zugreifen darf, weil das in einem anderen Thread liegt oder so.

Weiss jemand wie ich das lösen soll?

btw, ich habe VS 2005 also .NET 2.0

danke, yan1
 
Zuletzt bearbeitet:
Er hat einen delegate definiert und mit der Methode initialisiert,
in der der String dem Text-Property des Labels übergeben wird.
Danach hat er die Label.Invoke Methode aufgerufen und ihr diesen Delegate samt Parameter übergeben.
Somit wurde die Methode in dem Thread ausgeführt, in dem das Label erstellt wurde.

Such mal hier im Forum nach delagate oder möchtest Du ein Beispiel haben?
 
Sorry, ja die richtige Lösung hätte ich dazuschreiben sollen :eek:
Jepp genau.. ;)

ich habs so gmacht:

C#:
void myLabelTextÄndern(string neutext)
{
  this.myLabel.Text = neutext;
}
delegate TextÄnderMethode(string neutext);

void blubb()
{
  //Hier möchte ich den Text ändern, wessen Label in einem anderem Thread erzeugt  worden ist

  new TextÄnderMethode(this.myLabelTextÄndern).Invoke("Neuer Text");
}

Ich hoffe das stimmt jetzt so in etwa, ich hab die Lösung nicht vor mir liegen, aber so in etwa machte ichs glaube ich.

Lg, Yanick

}
 

Neue Beiträge

Zurück