Thank you for your quick answer!
I think I get how gnuradio works with history from your slides:
1. When flowgraph starts, the read pointer of input buffer is set
history()-1 items back.
2. After calling work()/general_work() function, gnuradio scheduler get the
number of consumed items of that input buffer and move the read pointer
forward by that number. Then scheduler wait until next time calling
work()/general_work() function.
Is it right?
And I think I find the error. In gr::block::general_work(), the parameter
ninput_items equals to the *sum* of *noutput_items of previous block* and
*history()-1*, isn't it? I thought ninput_items equals to noutput_items of
previous block when I built the block.