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:我尝试过用“游戏”替换“(开始)”,并尝试以各种组合的方式启动/停止。

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 回答