2010-12-14 18 views
1

Ich codiere ein Brettspiel in Qt, wo die Computer-KI nach einer Bewegung des Spielers pausieren und eine Weile nachdenken muss. Während es jedoch denkt, scheint der Bildschirm nicht aktualisiert zu werden, bis jede Codezeile ausgeführt wurde. Somit würde der Benutzer auf ein Quadrat klicken, für einige Sekunden nichts passieren sehen und dann plötzlich das Ergebnis seiner Bewegung und des Computers sehen.Erzwingen der Aktualisierung der Qt-GUI

In einem Versuch, das zu beheben, habe ich versucht, einen neuen Thread zu erstellen, auf dem die KI ihren Code ausführt und dann ihr Stück auf der Platine platziert. Manchmal (und das ist sehr inkonsistent) stürzt das Spiel ab, nachdem der Computer einen Zug gemacht hat.

So können ihr entweder:

  1. Sag mir, wie das Hauptfenster zwingen, seinen Inhalt zu aktualisieren
  2. Hilf ich versuchen, das Krachen Problem zu debuggen (Ich bin völlig neu für Themen)

BEARBEITEN - Ich habe versucht, Haltepunkte als Suszterpatt vorgeschlagen, und das Programm scheint im Debugger konsistent abstürzen (es war nicht bevor ich die Haltepunkte gesetzt).

Anyways, als ich durch das Programm Schritt, so scheint es, durch die run Funktion gut zu gehen, bis sie die Endung Klammer erreicht, und dann, wenn ich durch sie Schritt springt in Zeile 317 auf qthread_win.cpp, die nur sagt

finish(arg); //line 317 
return 0; 

Wenn ich durch diese Zeile gehe, friert der Debugger ein und Qt warnt mich nach 20 Sekunden. Wenn ich fortfahre, bekomme ich die Meldung "Diese Anwendung hat die Runtime angefordert, um es auf ungewöhnliche Weise zu beenden", die ich erhalte, wenn das Programm gelegentlich abstürzt, wenn ich nicht debugge.

Was soll ich jetzt tun?

+0

Sie sollten bei der Erstellung eines separaten AI-Threads bleiben. Debugging sollte nicht * zu * schwer mit nur 2 Threads sein, besonders wenn Sie bereits wissen, wo die Abstürze auftreten: Sie können wahrscheinlich einige Breakpoints plumpsen und sehen, welche als letzte ausgeführt wird, und dann von dort aus eingrenzen. – suszterpatt

+0

@susz in Ordnung, aber ich bin mir nicht sicher, wo die Abstürze auftreten. Going to going setting breakpoints in qt ... – wrongusername

Antwort

5

Die Ursache des Absturzes kann eine Vielzahl von Gründen haben, aber wenn ich eine Schätzung hätte, würde ich sagen, dass Sie wahrscheinlich Methoden eines GUI-Objekts (Label, Textfeld, Spielbrett usw.) aufrufen der AI-Thread. Die Art und Weise, wie Threads in Qt miteinander kommunizieren, geschieht über einen Mechanismus namens signals and slots: Der AI - Thread sollte eine Reihe von Signalen offenlegen, dh 'beginThink', 'endThink', und der UI - Thread sollte diese Signale registrieren (mit Slots) und reagieren entsprechend. Dies ist in den Dokumenten sehr gut dokumentiert.

+0

Ah, sollte ich also die Funktionszeiger, die ich gerade benutze, ablegen und stattdessen auf Signale und Slots umschalten? – wrongusername

+0

@wrong: Absolut. Qt macht wenige Dinge richtig IMO, aber Signale und Slots sind definitiv einer von ihnen. – suszterpatt

+0

Während ich im AI-Thread, der GUI-Objekte aufruft, nichts habe, sehe ich 'QPainter :: begin: Ein Malgerät kann immer nur von einem Maler gemalt werden. QPainter :: setBrush: Painter nicht aktiv 'und' QPainter :: drawRects: Painter nicht aktiv' wiederholt, bevor es abstürzt. – wrongusername

0

Versuchen Sie, den Code aus dem separaten Thread zu entfernen. Sobald Sie es funktioniert haben, können Sie versuchen, es zurück zu bewegen, und Sie werden wissen, dass Probleme mit Threading verbunden sind. Ich denke, Ihr Update-Problem wird verschwinden, wenn es alles auf dem gleichen Thread ist.

+0

Der Code funktioniert gut, wenn ich die 'run' Methode direkt aufrufen, anstatt den Thread mit' start' zu starten. Ich bin mir ziemlich sicher, dass es Threading betrifft, aber was willst du "alle im selben Thread" sein? – wrongusername

Verwandte Themen