Skip to content

Instantly share code, notes, and snippets.

@bowbow99
Created February 27, 2012 09:10
Show Gist options
  • Save bowbow99/1922648 to your computer and use it in GitHub Desktop.
Save bowbow99/1922648 to your computer and use it in GitHub Desktop.
#xyzzy のタイマー実行と sleep-for の合わせ技が inconsistent
#|
ちょっちわかりにくいけど、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