Created
February 27, 2012 09:10
-
-
Save bowbow99/1922648 to your computer and use it in GitHub Desktop.
#xyzzy のタイマー実行と sleep-for の合わせ技が inconsistent
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#| | |
ちょっちわかりにくいけど、thunk の関数をタイマーで繰り返し呼び出してる。 | |
thunk は3回目で自分のタイマーを止めて finish をセットして終了する。 | |
元のスレッドは、`(start-timer 1 thunk)` した後、`(while ...)` の中で | |
`(sleep-for 1)` してタイマーで呼び出される thunk が終わるのを待ってる。 | |
終わったら msgbox 出して完了。 | |
普通に(メインスレッドで)実行すると完了まで進むんだけど、`timer-test` | |
をタイマーで(バックグラウンドから)実行するとタイムアウトしてしまう。 | |
後でもうちょっと調べる。 | |
|# | |
(defun timer-test () | |
(handler-case | |
(let ((n 0) | |
thunk | |
(start (get-internal-real-time)) | |
(finish nil)) | |
(setf thunk (lambda () | |
(message "~S" n) | |
(when (> (incf n) 2) | |
(stop-timer thunk) | |
(setf finish (get-internal-real-time))))) | |
(start-timer 1 thunk) | |
(while (not finish) | |
(sleep-for 1) | |
(when (> (get-internal-real-time) (+ start (* 4 1000))) | |
(error "timer-test timeout."))) | |
(msgbox "timer-test finished successfully!!~2%start: ~S~%finish: ~S" | |
start finish)) | |
(error (error) | |
(msgbox "Error: ~A" error)))) | |
=> timer-test | |
;; 普通に実行 | |
(timer-test) | |
=> :ok | |
;; タイマーでバックグラウンドから実行 | |
(start-timer 1 'timer-test t) | |
=> t |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment