次のカウントダウンタイマーコードがあります。大丈夫ですが、停止ボタンを押しても停止しません。このスリーピングプログラムをラケットで止める方法
#lang racket/gui
(define myframe (new frame% [label "Timer"] [x 500] [y 200]))
(define tfsecs (new text-field% [parent myframe] [label "Secs:"]))
(define msgbmi (new message%
[parent myframe] [auto-resize #t] [label ""]))
(define stopflag #f)
(define (OnButtonPressFn n)
(sleep 1)
(set! n (sub1 n))
(define m 0)
(send msgbmi set-label "")
(for((i (in-naturals)) #:break stopflag)
(set! m (- n i))
; (printf "running; i= ~a~n" m)
(send msgbmi set-label (number->string m))
(sleep 1)))
(define startbutton
(new button% [parent myframe] [label "Start"]
(callback (lambda (b e)
(define secs (string->number (send tfsecs get-value)))
(when secs (OnButtonPressFn secs))))))
(define stopbutton
(new button% [parent myframe] [label "Stop"]
(callback (lambda (b e)
(set! stopflag #t)))))
(send myframe show #t)
それは私が0でそれを終了するforループを制限する場合は停止しますが、私はそれが停止ボタンが押されまでに多くの時間が経過する様子を維持したいです。
明らかに、ストップボタンで設定されているストップフラグは、ループ実行中に読み込まれていません。どのようにこれを修正することができますか?ここで停止ボタンを正しく機能させるにはどうすればいいですか?
はい、動作します。ありがとう。私がする必要があった別のものは、停止ボタンによって行われた変更を元に戻すために、startbuttonのコールバックに(set!stopflag #f)を追加することです。 – rnso