2016-05-10 16 views
0

Ich mache ein N * N Königinnen-Problem mit GUI. Ich möchte die GUI für x Sekunden jeder Bewegung von jeder Königin stoppen, Problem ist, das Programm stapelt nur alle Wartezeiten zusammen und dann läuft alles mit Geschwindigkeit. Ich gebe den Code hier: http://pastebin.com/s2VT0E49Schlaf blockiert ganzes Programm (Smalltalk Squeak)

EDIT: Das ist mein Arbeitsplatz:

board := MyBoard new initializeWithStart: 8. 
Transcript show:'something'. 
3 seconds asDelay wait. 
board solve. 
3 seconds asDelay wait. 
board closeBoard. 

Dies ist, wo ich das Warten wollen

canAttack: testRow x: testColumn 
    | columnDifference squareMark | 
    columnDifference := testColumn - column. 
    ((row = testRow 
     or: [row + columnDifference = testRow]) 
     or: [row - columnDifference = testRow]) ifTrue: [ 
      squareDraw := squareDraw 
      color: Color red. 
      0.2 seconds asDelay wait.   
      ^true ]. 

    squareDraw := squareDraw color: Color black. 
^neighbor canAttack: testRow x: testColumn 
+1

Beim nächsten Mal versuchen Sie bitte relevante Teile des Codes und so wenig Code wie möglich zu veröffentlichen. Die Verknüpfung mit dem Code wird in SO nicht als gute Praxis angesehen. Zeigen Sie auch, was Sie versucht haben, das Problem zu beheben. –

+0

Wie wäre es jetzt @MaxLeske – Infested

+0

Viel besser. Ich habe die Lesbarkeit etwas verbessert. –

Antwort

1

Um Ihren Arbeitsbereich Code Arbeit fügen Sie diese, bevor die Verzögerung zu machen:

World doOneCycle. 

Dies wird die Morphic Welt verursachen erneut angezeigt werden.

Beachten Sie, dass dies schnell und sehr schmutzig Hack und nicht der richtige Weg ist, es zu tun (siehe meine andere Antwort). Verzögerungen blockieren den gesamten UI-Prozess, während der ganze Sinn von Morphic darin besteht, dass Sie während der Ausführung Ihres Codes viele Dinge gleichzeitig tun können.

4

Der Prozess passieren, du bist Aussetzen ist die, in der Ihr Programm läuft. Dieser Prozess ist auch der UI-Prozess. Wenn Sie also Ihr Programm anhalten, unterbrechen Sie auch die Benutzeroberfläche, und die Benutzeroberflächenelemente erhalten somit keine Möglichkeit, sich selbst zu aktualisieren. Versuchen Sie Ihr Programm in einem separaten Prozess ausgeführt wird:

[ MyProgram run ] forkAt: Processor userBackgroundPriority. 

Beachten Sie, dass die UI-Prozess in der Regel mit der Priorität läuft 40. #userBackgroundPriority ist 30. Dies stellt sicher, dass Sie nicht die Benutzeroberfläche sperren kann.

5

Da Sie Morphic verwenden, sollten Sie stepping für Animationen, keine Prozesse oder Verzögerungen verwenden. In Ihrem Morph implementieren Sie eine step Methode. Dies wird automatisch und wiederholt ausgeführt. Implementiere auch stepTime, um das Intervall in Millisekunden zu beantworten, z. 4000 für alle 4 Sekunden.

Berechnen Sie in der Schrittmethode Ihren neuen Status. Wenn jede Dame als separate Figur modelliert wird und Sie nur die Positionen verschieben, kümmert sich Morphic um die Aktualisierung des Bildschirms. Wenn Sie Ihre eigene drawOn: Methode haben, rufen Sie self changed in Ihrer step Methode auf, damit Morphic später Ihren Zeichencode aufruft.

Sehen Sie dieses Tutorial: http://static.squeak.org/tutorials/morphic-tutorial-1.html

+0

Ich benutze das Quietschen Rechteck, ich werde seinen Code nicht ändern. Könnten Sie auf dem Schrittding ein Codebeispiel bereitstellen? – Infested

+0

Sie können dies nicht von einem Arbeitsbereich (zumindest nicht sauber) tun. Setzen Sie Ihren Code in eine tatsächliche Klasse (siehe den Tutorial-Link, den ich hinzugefügt habe). Es gibt eine Vielzahl von Beispielen im Bild: Durchsuchen Sie die Implementierer von "Schritt". Squeaks Quellcode ist wie eine Hypertext-Datenbank, die über "Absender" und "Implementierer" verbunden ist. Sie wählen einen Nachrichtennamen aus und drücken cmd-n oder cmd-m, um sie zu sehen. –