2012-04-12 4 views
2

Also versuche ich ein Programm zu schreiben, das sowohl die big-bang (siehe 2htdp/universe) Funktion als auch Dialoge verwendet (siehe racket/gui/base). Mein Problem ist, dass ich es so will, dass das Programm beide Fenster zur gleichen Zeit anzeigt, aber ich habe eine harte Zeit, die diesen Teil herausstellt, da beide Funktionen "geschlossen/vervollständigt" werden müssen, damit Code weitergeht. Dies ist, was ich versucht habe, ohne Glück (wegen dem, was vorher gesagt wurde):Big-Bang und Dialog Anwendung (Racket/Scheme)

#lang racket 

(require 2htdp/universe 
     racket/gui/base) 

(define dialog (instantiate dialog% ("Title"))) 
(define (render data) 
    ...) 

(define main 
    (begin 
     (big-bang ... 
     (on-draw render)) 
     (send dialog show #t))) 

Mit dieser Probe [template] Code, die Big-Bang-Anwendung zeigt zuerst, und für den Dialog, Sie zu zeigen, muss die Big-Bang-Anwendung schließen. Um es wiederholen zu können, möchte ich in der Lage sein, beide gleichzeitig anzeigen zu lassen.

Wenn Sie weitere Informationen zu diesem Problem wünschen, lassen Sie es mich wissen. Vielen Dank im Voraus für jede Hilfe.

Antwort

4

Sie können in separaten Fäden mit ihren eigenen eventspaces, die beide diese laufen, die sie blockiert jeweils anderen Ausführung behalten sollte. Erwarten Sie, dass es eine Kommunikation zwischen den beiden geben wird?

Hier ist ein Beispiel:

#lang racket 

(require 2htdp/universe 
     2htdp/image 
     racket/gui/base) 

;; start-dialog: -> void 
(define (start-dialog) 
    (define dialog (new dialog% [label "A sample title"])) 
    (send dialog show #t)) 

;; start-up-big-bang: -> number 
(define (start-up-big-bang) 
    (big-bang 0 
      (on-tick add1 1) 
      (to-draw draw))) 

;; draw: number -> image 
(define (draw w) 
    (text (format "I see my number is: ~a" w) 20 "black")) 

;; We create fresh eventspaces for each. 
;; See: http://docs.racket-lang.org/gui/windowing-overview.html#(part._eventspaceinfo) 
;; for more details. 
(define c1 (make-eventspace)) 
(define c2 (make-eventspace)) 

;; And now we can spawn off these two to run concurrently. 
(define t1 (parameterize ([current-eventspace c1]) 
      (thread start-up-big-bang))) 
(define t2 (parameterize ([current-eventspace c2]) 
      (thread start-dialog))) 

;; Let's wait till both the big-bang and the dialog have closed. 
(thread-wait t1) 
(thread-wait t2) 
+0

Sinn macht. Ich bin mir nicht ganz sicher, ob ich sie noch direkt kommunizieren lassen werde oder nicht, aber es ist sehr wahrscheinlich. Wenn dies der Fall ist, würde es Probleme mit dieser Methode geben? –

+1

Ich muss zugeben, dass ich mir noch nicht ganz sicher bin, wie man mit All-Knall-Programmen mit Racket/GUI-Programmen reden kann: Ihr Einsatzzweck ist als anfängerfreundliche, einfache Standalone-Apps gedacht. Wenn Sie etwas substanzielleres brauchen, ist es einfacher, nur in Racket/GUI-Programmen zu bleiben. Sie können etwas bekommen, das in Racket/Gui weltähnlich aussieht. Sehen Sie: http://stackoverflow.com/questions/8402218/how-to-make-a-gui-using-lisp-drescheme-or-common-lisp/8468211#8468211 für ein Beispiel. – dyoo

+0

Okay. Dies ist das erste Mal, dass ich mit "Racket/Gui" herumspiele, also habe ich Big-Bang benutzt, einfach weil ich Erfahrung damit hatte. Wenn ich dasselbe Ziel erreichen kann (in der Lage, Plots (mit "Plot") und Linien/andere Formen zu zeichnen, mit ausschließlich Racket/GUI-Programmen, dann werde ich sie definitiv verwenden. –