Skywind wrote: > Bram Moolenaar wrote: > > Patch 8.0.0105 > > Problem: When using ch_read() with zero timeout, can't tell the > > difference > > between reading an empty line and nothing available. > > Solution: Add ch_canread(). > > Files: src/evalfunc.c, src/channel.c, src/proto/channel.pro, > > src/testdir/test_channel.vim, src/testdir/shared.vim, > > runtime/doc/eval.txt, runtime/doc/channel.txt > > This is fabulous, thanks for ch_canread() > However, a lot of messages are still dropped in spite of adding a sleep > before exiting: > > ----------------------------- > timerjob.vim > ----------------------------- > function! MyTimer(id) > let ch = job_getchannel(g:job) > let st = ch_status(ch) > if st == "fail" || st == "closed" > return > endif > if ch_canread(ch) > let text = ch_read(ch, {'timeout':0}) > caddexpr text > cbottom > endif > endfunc > > " according to channel.txt, add a close callback > function! MyClose(channel) > caddexpr "[channel closed]" > cbottom > endfunc > > copen 8 > cexpr "[python output]" > wincmd k > > let cmd = ['/usr/bin/python', 'timerjob.py'] > let opt = {"out_io": "pipe", "err_io": "out", "close_cb": "MyClose"} > > let job = job_start(cmd, opt) > let timer = timer_start(10, "MyTimer", {"repeat":-1}) > > ------------------------- > timerjob.py > ------------------------- > #! /usr/bin/env python2 > import sys, time > > for i in xrange(80000): > sys.stdout.write('timer job: this is line %d\n'%(i)) > sys.stdout.flush() > > # as channel.txt said, we need a sleep here > time.sleep(1) > > ------------------------- > output in quickfix > ------------------------- > || [python output] > || timer job: this is line 0 > || timer job: this is line 1 > || timer job: this is line 2 > || timer job: this is line 3 > || timer job: this is line 4 > || timer job: this is line 5 > ..... > || timer job: this is line 57 > || timer job: this is line 58 > || timer job: this is line 59 > || timer job: this is line 60 > || timer job: this is line 61 > || [channel closed] > > Only 62 messages have been received, almost 80000 - 62 = 79938 messages have > been dropped. > > I can sleep longer in timerjob.py, but I can't add a single sleep if I start > grep as a job. And I can't decide how long should I sleep to avoid dropping.
When writing the test I also had problems with messages being dropped. I thought that adding a close callback should fix it, but perhaps there is another situation where they are still dropped. Can you enable the channel log and see where the messages are dropped? -- hundred-and-one symptoms of being an internet addict: 57. You begin to wonder how on earth your service provider is allowed to call 200 hours per month "unlimited." /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org /// -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.