いしくらです。
# すでに2chに投げているネタです。
自宅PCをAthlon64X2 4600+にいれかえたら、Meadow 3.00-devのキーへの
反応が、以前より悪くなったので、ちょっと調べてみました。
結論から言うとメッセージスレッドの処理がまずそうです。
メッセージスレッドは、キー入力は以下のように処理するようです。
1-1)WaitMessage?()する。
1-2)PeekMessage?()で何かメッセージがが取れたら、
SetEvent?(keyboard_handle)を実行する。
・それがWM_KEYDOWNであれば、input_eventにキー情報を入れる。
・それ以外のメッセージについてはそれなりの処理をする。
メッセージが取れる限り1-2)の処理をくりかえす。
1-3)input_eventをkbd_buffer_store_event()でkbd_bufferに入れる。
1-4)1-1)に戻る。
一方、メイン側のキー入力の待ち方は以下のような感じです。
2-1)ResetEvent?(keyboard_handle)する
2-2)WaitForSingleObject?(keyboard_handle, ...)
2-3)kbd_bufferを読み、処理する。
つまり、待ってる方はeventをトリガにkbd_bufferを見に行くのに、待た
せてる方は、eventを出した後にkbd_bufferにセットしてるわけです。
これではHyperThreading環境やDUAL CPU環境など、2スレッド同時実行が
可能な環境では2-3)で空振り(=空のkbd_bufferを読む)するでしょう。
メッセージスレッドは、本来入れるべき情報を kdb_bufferに入れた後に
はじめてSetEvent?(keyboard_handle);するよう作るべきでしょう。
しかし、そう修正するのは面倒なので :-) 試しに下記のような修正を入
れて試してみたら、うちの環境ではキーの反応がよくなりました。
-
mw32term.c
| old |
new |
|
| 4716 | 4716 | break; |
|---|
| 4717 | 4717 | } |
|---|
| 4718 | 4718 | } |
|---|
| | 4719 | SetEvent (keyboard_handle); |
|---|
| 4719 | 4720 | WaitForSingleObject (next_message_block_event, INFINITE); |
|---|
| 4720 | 4721 | } |
|---|
| 4721 | 4722 | |
This ticket was imported from scarab issue MW128