I would suggest not to seperate the input gathering and input reacting threads.
In my opinion you should handle input gathering and then input reacting immediately afterwards, in the same thread. That way input is processed as soon as it arrives, in the same frame that it arrives.
That doesnt work. Try the following: type "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA". If you hold down the "A" key, you'll notice that the first "A" is written immediately. Then there is a short pause before the other "A"'s are written.
And thats the problem with handling the key input immediately. It doesnt behave natural then.
But I found the workaround:
I'm saving the system time when the key was pressed. Then I'm computing the way which was left behind by multiplying the speed with the time since the key was pressed. That way I'm independent of when the Thread is called. And it works perfectly, the figur now moves smoothly as it should.
But is there any other way? I dont think that my method is the perfect solution. So again: How do you do it?