[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: timer doesn't work in XEmacs
>>>>> In [emacs-w3m : No.02489] 有沢さん wrote:
> XEmacs の `run-at-time' や `start-itimer' は、timer を登録した
> 時刻からではなくって、前回 timer が動いた時刻
> (itimer-timer-last-wakeup) からの経過時間で動いてしまうようです…。
結局それを追いかけても解が見つかりませんでした。また Gnus は
(nnheader-xmas-run-at-time TIME REPEAT FUNCTION &rest ARGS)
というものを start-itimer を使って実装しているんですが、ARGS が
FUNCTION の実行時に評価されるようになっていて、これは失敗です。
幸い ARGS を与える使い方はしていないんですが。
で、第一引数の TIME が nil かゼロのときはまともに動作することに
目を付けて、いつもの力づく方式で解を得ました:
(defun run-at-time-in-the-right-way (time repeat function &rest args)
(if (or (not time)
(eq 0 time))
(apply #'run-at-time nil repeat function args)
(let ((timers (list nil)))
(setcar
timers
(apply #'run-at-time nil time
(lambda (timers repeat function &rest args)
(if repeat
(timer-set-function
(car timers)
(lambda (timer repeat function &rest args)
(timer-set-time timer (list 0 0 0) repeat)
(timer-set-function timer function args)
(apply function args))
(append timers (list repeat function) args))
(timer-set-function
(car timers)
(lambda (timer function &rest args)
(cancel-timer timer)
(apply function args))
(append timers (list function) args))))
timers repeat function args)))))
後で XEmacs-beta に送って、emacs-w3m でも作業しようと思います。
Gnus はどうしようかなあ、pgg.el で run-at-time をそのまま使って
いるところは明らかに問題なんですが。
--
Katsumi Yamaoka <yamaoka@jpl.org>