2013-06-22 19 views
5

我想用投機的方式在球拍中運行一個表達式,希望(但不是特別期待)結果。我的代碼有很長的時間限制。有沒有簡單的方法來運行一些球拍代碼幾秒鐘,然後可靠地殺死它並在截止日期之前執行回退代碼?球拍運行一段時間的線程

回答

5

是的,一個簡單的方法是使用engine庫。例如:

#lang racket 

(require racket/engine) 

(define e (engine 
      (λ (_) 
      ;; just keep printing every second 
      (let loop() 
       (displayln "hi") 
       (sleep 1) 
       (loop))))) 

;; run only for 2 seconds 
(engine-run 2000 e) 

代替指定的時間,還可以使線程停止時的事件觸發運行指定event對象。

+0

同時發佈的答案不是很可愛嗎? :)說真的,我甚至都不知道「球拍/引擎」,這很整齊。 –

3

您可以創建一個「worker」線程來完成工作,而另一個「watcher」線程可以殺死worker。

這在文檔的More: Systems Programming部分進行了描述。

最簡單的,第一切口可滿足您的計算:

(define (accept-and-handle listener) 
    (define-values (in out) (tcp-accept listener)) 
    (define t (thread 
       (lambda() 
       (handle in out) 
       (close-input-port in) 
       (close-output-port out)))) 
    ; Watcher thread: 
    (thread (lambda() 
      (sleep 10) 
      (kill-thread t)))) 

不過,如果你正在處理的其他資源閱讀了解保管人。

+0

使用此方法,將第一個線程的結果返回到主線程的最佳方法是什麼? (線程發送)似乎有點難看,我想要的只是像(線程等待t)那樣阻塞t並返回結果。有沒有簡單的方法來做到這一點? – So8res

+0

好點。你可以嘗試一個['channel'](http://docs.racket-lang.org/reference/channel.html) - 讓工作人員'channel-put'成爲正常結果,讓觀察者'channel-put'一個超時結果,並讓主線程執行'channel-get'來等待先到的那個。 –