Laden...

[erledigt] Zyklisch einen Status prüfen

Erstellt von Shinobi vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.464 Views
S
Shinobi Themenstarter:in
14 Beiträge seit 2008
vor 14 Jahren
[erledigt] Zyklisch einen Status prüfen

Hallo Leute,

ich hab mir jetzt schon einige Sachen zum Thema Multithreading und Backgroundworker durchgelesen, gegooglet und getestet...
irgendwie schaff ichs jedoch nie, die besagten Beispiele auf mein Programm umzuschreiben.

Hier der QT vom Backgroundworker:

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker BotWorker = sender as BackgroundWorker;
            e.Result = BotGamer(BotWorker);

            if (BotWorker.CancellationPending)
            {
                e.Cancel = true;
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                MessageBox.Show("Fehler");
            }
            else
            {
                MessageBox.Show("kein Fehler");
            }
        }

Ich hab das doch richtig verstanden, dass man innerhalb DoWork-Methode eine Methode aufruft und das Ergebnis davon mittels e.Result abfängt oder? In der RunWorkerCompleted-Methode prüfe ich lediglich ob es zu einem Fehler kommt oder nicht (zum Testen ob das ganze auch funktioniert).

Hier der QT der aufgerufenen Methode:

public int BotGamer(BackgroundWorker BotWorker)
        {
            while (!this.backgroundWorker1.CancellationPending)
            {
                if (SpielAuslesen(0) == "1")
                {
                    if (ConfAuslesen(6) == "False" && SpielAuslesen(0) == "1")
                    {
                        //Computer ist an der Reihe
                        Random rnd = new Random();
                        Thread.Sleep(rnd.Next(400, 1200));
                        if (BotConfAuslesen(0) == "True")
                        {
                            spielzug((rnd.Next(1, 3)));
                        }
                        else
                        {
                            spielzug((3 + 1 - Convert.ToInt32(SpielAuslesen(2))));
                        }
                    }
                }
                else
                {
                    Thread.Sleep(500);
                }
            }
            return 0;
        }

Geplant war eigentlich, dass der Backgroundworker startet wenn ein bestimmter Wert in der Configdatei auf False ist. Der bgw soll die Methode aufrufen, welche dann in einer Schleife prüft ob der Wert immernoch gleich ist. Nach den Prüfungen und Berechnungen soll das Ergebnis zurückgegeben werden und eine andere Methode aufrufen. Der bgw soll jedoch erst beendet werden wenn ich einen Button drücke, solange sollen die Prüfungen und Berechnungen weiterhin durchgeführt werden.

Weiß einer zufällig auf den ersten Blick wo der Fehler liegen könnte?

Thx schonmal

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Shinobi,

was genau ist das Problem? Was läuft falsch?

Siehe [Hinweis] Wie poste ich richtig? Punkt 5 und Punkt 3.

herbivore

3.971 Beiträge seit 2006
vor 14 Jahren

Der BGW ist prinzipiell falsch, wenn du alle 500 ms einen Status prüfen möchtest und entsprechend daraufhin eine aktion ausführen möchtest.

Für sowas nimmt man einen Timer (System.Threading.Timer).

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

S
Shinobi Themenstarter:in
14 Beiträge seit 2008
vor 14 Jahren

sry herbivore, werd zukünftig besser drauf achten 8o
@kleines_eichhoernchen: thx, genau das wars, was ich nun doch brauchte =) klappt soweit