Laden...

MessageBox anzeigen und bei beenden eines anderen Threads schließen

Erstellt von Muphin vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.447 Views
M
Muphin Themenstarter:in
174 Beiträge seit 2006
vor 16 Jahren
MessageBox anzeigen und bei beenden eines anderen Threads schließen

Guten Tag!

Ich möchte beim ausführen eines Threads eine "Bitte warten!" Message Box anzeigen, damit auf dem eigentlichen Control z.B. keine Tasten mehr gedrückt werden können! Sobald der Thread nun fertig ist mit seiner Aufgabe soll die MessageBox wieder geschlossen werden. Außerdem soll beim drücken des Abbrechen Buttons der Thread abgebrochen werden.
Bisher sieht mein Code dazu so aus:


      private void btn_komplettLoesen_Click( object sender, System.EventArgs e )
      {
         Thread a_loeseThread = new Thread( new ThreadStart( loese ) );
         a_loeseThread.Start();
         DialogResult a_result = MessageBox.Show( "Bitte warten!", "löse", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1 );
         if( a_result == DialogResult.Cancel )
         {
            a_loeseThread.Abort();
         }
      }

Leider konnte ich keine möglichkeit finden nur einen Abort-Button anzeigen zu lassen, außerdem weiß ich nicht wie ich es anstellen soll das die MessageBox wieder verschwindet wenn der Thread fertig bearbeitet ist. Ich hoffe auf eure Hilfe!

Gruß Muphin

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Muphin,

in Threads solltest MessageBoxen grundsätzlich nicht verwenden! Stelle dein Programm so um, dass alle MessageBoxen vom GUI-Thread angezeigt werden.

MessageBoxen kann man nicht so ohneweiteres abbrechen. Dazu müsstest du besser eigene Forms nehmen.

herbivore

M
Muphin Themenstarter:in
174 Beiträge seit 2006
vor 16 Jahren

In meinem Fall wird doch die Message Box vom GUI-Thread angezeigt, oder hab ich da jetzt was falsch verstanden?

Dann wär in meinem Fall wohl das Beste ich bastel mir sozusagen eine eigene MessageBox die nur den Abbrechen Button enthält und die ich dann am Ende des gestarteten Threads schließe! Ich hatte nur gehofft dass das ganze etwas einfacher is!
Gibts vielleicht eine andere möglichkeit das Control zu sperren solange der Thread ausgeführt wird?

Gruß Muphin

915 Beiträge seit 2006
vor 16 Jahren

Mach es dir doch einfach:

Rufe aus deiner <HauptForm>heraus ein neues Formular auf mit <WaitForm>.ShowDialog.
In diesen Waitform startest einen Thread der etwas abarbeitet. Nachdem der Thread fertig mit der verarbeitung ist startest eben this.Close. This.Close überschreibst du vorher wie folgt:


  public new void Close()
        {
            if (this.InvokeRequired) this.Invoke(new MethodInvoker(this.Close));
            else { base.Close(); }
        }

Damit dein <WaitForm> keine Fehler auslöst. Wenn das <WaitForm> geschlossen ist, wurde dein Thread abgearbeitet. Wenn den Inhalt aus deinem Thread in der <Waitform> weitergeben möchtest an die <Hauptform> dann erweitere noch <WaitForm>.ShowDialog um den Returnwert oder übergib es halt Global als Propertie.

Schön wäre noch nen Fortschritszähler wie eine Progressbar. Diese füllst du innerhalb deines <WaitForm> Threads mit Invoke um <ProgressBar>.Value++.

Und Fertig ist das ganze und sieht auch einigermaßen sauber aus.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Muphin,

Form.Enabled = false

herbivore

M
Muphin Themenstarter:in
174 Beiträge seit 2006
vor 16 Jahren

@Andreas.May
Dankeschön, das klappt richtig gut!


   public partial class bittewarten : Form
   {
      Thread m_loeseThread;
      XForm m_main;
      public bittewarten( XForm t_main )
      {
         InitializeComponent();

         m_main = t_main;
         m_loeseThread = new Thread( new ThreadStart( start ) );
      }

      private void start()
      {
         m_main.loese();
         this.Close();
      }

      private void cancel_Click( object sender, EventArgs e )
      {
         m_loeseThread.Abort();

         this.Close();
      }

      public new void Close()
      {
         if( this.InvokeRequired ) this.Invoke( new MethodInvoker( this.Close ) );
         else base.Close();
      }

      public new void ShowDialog()
      {
         m_loeseThread.Start();
         base.ShowDialog();
      }
   }

Ich würde nur am liebsten noch in dem Control das MessageBoxIcon.Exclamation anzeigen! Die einzigste Idee die ich bisher dazu hatte war einen Screenshot davon zu machen und diesen dann in eine PictureBox zu packen, das blöde daran ist nur das wenn jemand eine andere Hintergrundfarbe für die Dialogfelder gewählt hat um das Ausrufezeichen eben die Farbe von meinem Screenshot gezeigt wird und nicht die eingestellte Hintergrundfarbe! Gibts ne möglichkeit die picture Box so anzupassen dass nur das gelbe dreieck genau reinpasst oder das Icon direkt anzuzeigen?

Gruß Muphin

915 Beiträge seit 2006
vor 16 Jahren

Buh, also es gibt auch ne Möglichkeit sich direkt in MessageBox.Show reinzuklinken.
Ich habe es zwar auf Anfrage da, aber es nimmt sehr viel Zeit in anspruch.

Mach aber besser folgendes:


this.BackColor = System.Drawing.SystemColors.Info;
this.ControlBox = false;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;

Und benutze eines der Icons für die Darstellung:
C:\Program Files\Microsoft Visual Studio 8\Common7\VS2005ImageLibrary\VS2005ImageLibrary.zip\VS2005ImageLibrary\icons

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

M
Muphin Themenstarter:in
174 Beiträge seit 2006
vor 16 Jahren

Die Farbe lass ich lieber auf Control, spricht mich irgendwie eher an wie das ganze als Info einzufärben!
ControlBox auf false is ne gute Idee, danke, so hab ich schon nich n Problem irgendwie das schließen als drücken der Abbrechen Taste zu interpretieren!
Ein FixedDialog isses schon 😉

Die VS2005ImageLibrary hab ich leider nich, wahrscheinlich wegen der Express Version!

Für das Hintergrundfarbenproblem und das Icon hab ich inzwischen auch eine etwas andere Problemlösung gefunden! Und zwar unterstützt das png Format mehrstufige Transparenz. Ich hab also einen Screenshot im Adobe ImageReady etwas überarbeitet und hab nun das Icon das sich schön an den Hintergrund anpasst!
Das wär dann doch noch ein guter Start ins Wochenende 🙂

Gruß Muphin