[Date Prev][Date Next][Thread Prev][][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>