我发现如何在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:我尝试用“游戏”代替“(开始)”,并以各种组合方式将thunking / unthinking开始/停止。
答案 0 :(得分: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))))