2

そこで、関数big-bang( を参照2htdp/universe) とダイアログ ( を参照)の両方を使用するプログラムを作成しようとしていますracket/gui/base私の問題は、プログラムが両方のウィンドウを同時に表示するようにしたいということですが、コードを続行するには両方の機能を「閉じる/完了する」必要があるため、その部分を理解するのに苦労しています。これは私が試したものですが、運がありません(以前に言われたことによる):

#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)))

このサンプル [テンプレート] コードでは、最初にビッグバン アプリケーションが表示されます。ダイアログを表示するには、ビッグバン アプリケーションを閉じる必要があります。繰り返しますが、両方を同時に表示できるようにしたいと考えています。

この問題についてさらに詳しい情報が必要な場合は、お知らせください。助けてくれてありがとう。

4

1 に答える 1

4

これらの両方を独自のイベントスペースを持つ別々スレッドで実行できます。これにより、互いの実行がブロックされないようにする必要があります。ふたりの間にコミュニケーションがあると思いますか?

次に例を示します。

#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)
于 2012-04-12T04:07:09.457 に答える