Multithreading 我怎样才能把球拍上的线弄断?Kill线程继续使用;proc";而不是线程
我发现如何在球拍上断线非常令人沮丧 它似乎足够基本,在任何指南或文档中都没有明确说明(有些东西似乎是相关的,但我不明白如何将其应用到我的情况中,因为它没有提供一个流程如何工作的心智模型) 每次我尝试(kill thread thread name)时,它都会返回一个错误,即该线程实际上是一个过程。但是,启动相同的线程可以很好地工作 我做错了什么 这是我目前的(可怕的)代码,我以前从来没有在Racket内外处理过很多线程,所以这可能超出了恶心的范围:Multithreading 我怎样才能把球拍上的线弄断?Kill线程继续使用;proc";而不是线程,multithreading,scheme,racket,Multithreading,Scheme,Racket,我发现如何在球拍上断线非常令人沮丧 它似乎足够基本,在任何指南或文档中都没有明确说明(有些东西似乎是相关的,但我不明白如何将其应用到我的情况中,因为它没有提供一个流程如何工作的心智模型) 每次我尝试(kill thread thread name)时,它都会返回一个错误,即该线程实际上是一个过程。但是,启动相同的线程可以很好地工作 我做错了什么 这是我目前的(可怕的)代码,我以前从来没有在Racket内外处理过很多线程,所以这可能超出了恶心的范围: (define game (lambda
(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
永远不会好用,只是你可能需要的比你最初预期的要少。谢谢你的指点。因此,要杀死一个线程,您只需停止线程过程(用钩子还是用钩子)?您为线程提供了一个函数。当该函数返回时,线程被终止。函数可能会做一些工作并返回,而不是永远循环。或者,它可能会在线程邮箱中查找消息,通道
或者说它应该退出的异步通道
(即,有东西要求它退出,而不是终止它)。这些是“礼貌”的方式。要强制使其停止,有终止线程
,也可以通过保管器。