如何在球拍中杀死一个线程? Kill-thread继续使用“proc”而不是线程

时间:2013-08-08 15:47:54

标签: multithreading scheme racket

我发现如何在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开始/停止。

1 个答案:

答案 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))))