Multithreading 我怎样才能把球拍上的线弄断?Kill线程继续使用;proc";而不是线程

Multithreading 我怎样才能把球拍上的线弄断?Kill线程继续使用;proc";而不是线程,multithreading,scheme,racket,Multithreading,Scheme,Racket,我发现如何在球拍上断线非常令人沮丧 它似乎足够基本,在任何指南或文档中都没有明确说明(有些东西似乎是相关的,但我不明白如何将其应用到我的情况中,因为它没有提供一个流程如何工作的心智模型) 每次我尝试(kill thread thread name)时,它都会返回一个错误,即该线程实际上是一个过程。但是,启动相同的线程可以很好地工作 我做错了什么 这是我目前的(可怕的)代码,我以前从来没有在Racket内外处理过很多线程,所以这可能超出了恶心的范围: (define game (lambda

我发现如何在球拍上断线非常令人沮丧

它似乎足够基本,在任何指南或文档中都没有明确说明(有些东西似乎是相关的,但我不明白如何将其应用到我的情况中,因为它没有提供一个流程如何工作的心智模型)

每次我尝试(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:我尝试过用“游戏”替换“(开始)”,并以各种组合敲击/不思考开始/停止。

现在,您正在创建新线程,并使用
(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))))

非常感谢你。由于缺乏代表性,我无法投票,但这看起来是一个很好的解决方案。没问题。确保你看到了我刚才在顶部的内容,这样你就可以看到最初的方法出了什么问题。干杯。我已经读过了,明白我错在哪里了。作为对你关于“只需要跟踪一个主游戏线程”的观点的回应,(对我来说,它是这样的),这是否意味着这不是一个可扩展的解决方案?我在哪里可以了解到启动和停止线程的更典型的方法?您可以继续使用
(当前线程)
,具体取决于作用域,必要时还可以在列表中存储对线程的引用。这要看情况而定。您还可以使用本地定义,这同样取决于您的实现。我将尝试寻找一个多线程示例这个问题已经得到了回答/接受,所以只需要一些评论。1.有关使用
线程的更多示例,请参阅。2.此外,还有“保管人”删除线程和其他资源的想法。3.我在Racket中写了大量的
线程
代码,很少使用
杀死线程
。相反,线程过程退出以终止自身,或者,保管人确保它已终止。这并不是说,
kill-thread
永远不会好用,只是你可能需要的比你最初预期的要少。谢谢你的指点。因此,要杀死一个线程,您只需停止线程过程(用钩子还是用钩子)?您为
线程提供了一个函数。当该函数返回时,线程被终止。函数可能会做一些工作并返回,而不是永远循环。或者,它可能会在线程邮箱中查找消息,
通道
或者说它应该退出的
异步通道
(即,有东西要求它退出,而不是终止它)。这些是“礼貌”的方式。要强制使其停止,有
终止线程
,也可以通过保管器。