2

Racket でスレッドを強制終了する方法を考え出すのは非常にイライラします。

ガイドやドキュメントに明示されていないほど基本的なようです(関連していると思われるものがありますが、プロセスがどのように機能するかについてのメンタルモデルを提供しないため、自分の状況に適用する方法がわかりません) .

(kill-thread thread-name) を試行するたびに、スレッドが実際にはプロシージャであるというエラーが返されます。ただし、同じスレッドの開始は正常に機能します。

私は何を間違っていますか?

現時点での私の(恐ろしい)コードは次のとおりです。Racket の内外でスレッドをあまり操作したことがないので、これはおそらく嫌なことではありません。

(define game
  (lambda ()
    (let loop ()
      (sleep 2)
      (printf "game running \n")
      (loop))))

(define start (lambda () (thread game)))
(define stop (lambda () (with-handlers
                            ([exn:fail? 
                              (lambda (exn)
                                 (displayln (string-append "Failed to kill main game thread. " (exn-message exn)))
                                #f)])
                          (kill-thread (start)))))

E: "(start)" を "game" に置き換えたり、サンク/無意識にスタート/ストップをさまざまな組み合わせで試してみました。

4

1 に答える 1

3

現在、新しいスレッドを作成して ですぐに削除していますが(kill-thread (start))、古いスレッドはそのままです。

単一のメイン ゲーム スレッド (開始と停止を通過する唯一のもの) を追跡するだけでよい場合set!は、スレッドを追跡するためにグローバル変数を使用できます。

#lang racket

(define game
  (lambda ()
    (let loop ()
      (sleep 2)
      (printf "game running \n")
      (loop))))

(define GAME-THREAD (void))

(define start (lambda () (set! GAME-THREAD (thread game))))
(define stop (lambda () (with-handlers
                            ([exn:fail? 
                              (lambda (exn)
                                 (displayln (string-append "Failed to kill main game thread. " (exn-message exn)))
                                #f)])
                          (kill-thread GAME-THREAD))))
于 2013-08-08T15:58:47.170 に答える