New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

timer_info()を連続でcallし続けるとtimerが止まらない #1052

Closed
rapan931 opened this Issue May 12, 2017 · 8 comments

Comments

Projects
None yet
3 participants
@rapan931

質問・報告の内容

timer.vim①:

function! MyDummy(t_id)
  silent echomsg "hoge"
endfunction

call timer_stopall()
let t_id = timer_start(100, 'MyDummy')
try
  redir => out
  while !empty(timer_info(t_id))
    if !empty(timer_info(t_id))
      silent echomsg timer_info(t_id)[0].remaining
    endif
  endwhile
finally
  redir END
endtry
  • vim -Nu NONE -S timer.vim
  • <C-Break>(無限ループに入っているようだったのである程度時間がたったところで強制終了)
  • i<C-r>=out

実行結果は以下です。
timer_info()で取得できるremainingがマイナス値になりますし、
かつ無限ループに入っていそうな挙動になります。

99
99
99
:
: (省略)
:
0
0
0
-1
-1
-1
:
: (省略)
:
-6498
-6498
-6498
-6498

色々試してみたところtimer_info()呼ぶ前にsleep 1msを追加すると
無限ループしませんでした。

timer.vim②(timer.vimにsleep 1ms追加):

function! MyDummy(t_id)
  silent echomsg "hoge"
endfunction

call timer_stopall()
let t_id = timer_start(100, 'MyDummy')
try
  redir => out
  while !empty(timer_info(t_id))
    sleep 1ms " 追加
    if !empty(timer_info(t_id))
      silent echomsg timer_info(t_id)[0].remaining
    endif
  endwhile
finally
  redir END
endtry

timer.vim②を使っての実行結果

91
75
59
44
28
13
-2
hoge

Vimのバージョン

:version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled May  2 2017 12:56:07)
MS-Windows 64 ビット コンソール 版
適用済パッチ: 1-596
Modified by koron.kaoriya@gmail.com

OSの種類/ディストリ/バージョン

Windows7 Professional

使用している or 関係していそうなプラグイン

なし

その他

  • 前提として、timer_start()で指定したcallback関数が規定回数(デフォルト1)callされた後は
    timer_info(id)は空配列を返す仕様と認識しています。
    (たぶんこの仕様だと思うのですが、:help見たところ記載が見当たりませんでした)

  • (蛇足ですが)haya14busaさんのvim-operator-flashyにあるs:sleep関数を
    Timer使って作り直せないか試しているところで今回の事象に気づきました。
    https://github.com/haya14busa/vim-operator-flashy/blob/master/autoload/operator/flashy.vim#L96

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok May 15, 2017

Member

timer callback は sleep 呼び出しかキー入力受付時に実行されます。
timer_info() は関係なくて、ループ中に timer callback を実行する契機がない (のでループから出られない) ということです。

Member

ichizok commented May 15, 2017

timer callback は sleep 呼び出しかキー入力受付時に実行されます。
timer_info() は関係なくて、ループ中に timer callback を実行する契機がない (のでループから出られない) ということです。

@rapan931

This comment has been minimized.

Show comment
Hide comment
@rapan931

rapan931 May 15, 2017

@ichizok 回答ありがとうございます。

コールバックは Vim が入力待ちの場合だけ呼び出される。

timer_info()のヘルプにもちゃんと記載されていました。。失礼しました。
timer_start()のヘルプにもちゃんと記載されていました。。失礼しました。

本件仕様通りですので、closeさせていただきます。
お騒がせしました。

rapan931 commented May 15, 2017

@ichizok 回答ありがとうございます。

コールバックは Vim が入力待ちの場合だけ呼び出される。

timer_info()のヘルプにもちゃんと記載されていました。。失礼しました。
timer_start()のヘルプにもちゃんと記載されていました。。失礼しました。

本件仕様通りですので、closeさせていただきます。
お騒がせしました。

@rapan931 rapan931 closed this May 15, 2017

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east May 16, 2017

Member

timer_info()のヘルプにもちゃんと記載されていました。。

あれ?:h timer_info()には書かれていないですね。。

Member

h-east commented May 16, 2017

timer_info()のヘルプにもちゃんと記載されていました。。

あれ?:h timer_info()には書かれていないですね。。

@rapan931

This comment has been minimized.

Show comment
Hide comment
@rapan931

rapan931 May 16, 2017

@h-east 失礼しました。。。こちらtimer_start()のヘルプに記載されていることを書きたかったです。
コメントも修正しておきました。

@h-east 失礼しました。。。こちらtimer_start()のヘルプに記載されていることを書きたかったです。
コメントも修正しておきました。

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east May 16, 2017

Member

ありました。Thanks!
:h timer_start()して10+ですね。

The callback is only invoked when Vim is waiting for input.

Member

h-east commented May 16, 2017

ありました。Thanks!
:h timer_start()して10+ですね。

The callback is only invoked when Vim is waiting for input.

@rapan931

This comment has been minimized.

Show comment
Hide comment
@rapan931

rapan931 May 16, 2017

確認ありがとうございます。

今更気づきましたが、close時の手順(ラベル付与等)も決まっているのですね。(https://github.com/vim-jp/issues/wiki/Member)

以後気を付けます。

確認ありがとうございます。

今更気づきましたが、close時の手順(ラベル付与等)も決まっているのですね。(https://github.com/vim-jp/issues/wiki/Member)

以後気を付けます。

@h-east

This comment has been minimized.

Show comment
Hide comment
@h-east

h-east May 16, 2017

Member

@rapan931 たしかラベルはメンバーしか付けれなかったはずですので気にしなくって良いですよ。

Member

h-east commented May 16, 2017

@rapan931 たしかラベルはメンバーしか付けれなかったはずですので気にしなくって良いですよ。

@rapan931

This comment has been minimized.

Show comment
Hide comment
@rapan931

rapan931 May 16, 2017

@rapan931 たしかラベルはメンバーしか付けれなかったはずですので気にしなくって良いですよ。

そうなのですね。
了解です。

@rapan931 たしかラベルはメンバーしか付けれなかったはずですので気にしなくって良いですよ。

そうなのですね。
了解です。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment