2つのアプリをデュアルディスプレイのPCで同時に起動し、1つのアプリケーションである処理を行うと、もうひとつのアプリへSendMessageする処理で悩んでおります。
具体的にはホテルのカウンターシステムに似てるのですが、カウンター側で入室処理をするとカウンター側と顧客側の画面の両方を更新させます。画面は分かりやすいようにビジュアルで表現してまして、平面図のBMPに重ねた部屋ごとのTImageの色を変化するようにしました。
とまあ、ここまでは一応完成しております。
ところが、例えばカウンターアプリから4つの部屋を連続して空室にしたりすると、顧客側の画面の更新が追いつかないのか、4つ中2つだけ空室になり2つは入室中のままだったりと、処理が不安定になります。
1つずつゆっくり行えば問題はないのですが、それでは実用性が乏しくなってしまいます。
肝心のコードですが、以下の通り簡単に書いております。
hWnd := FindWindow(nil,'**顧客側アプリ名**');
SendMessage(hWnd, WM_REDRAW, 部屋番号, 0);
※WM_REDRAWメッセージはユーザー定義です。顧客側アプリでこのメッセージを受信したらパラメータの部屋番号のTImageを書き換える仕組みにしてます。
さまざまなところを調べた結果、SendMessageは処理が終わらないと制御が帰ってこないとありましたが、イメージ書き換え処理が重いのか、このような遅延が出る場合どうしたらよろしいのでしょうか?
SendMessageで送信先のアプリから戻り値を確認できるまで処理をとめても良いのですが(画面更新を確実にしたいので)、何か参考になるサイトとかあれば教えて下さると非常に助かります。
環境を書き忘れました。
開発環境はWindows2000+Del6Entです。
稼動予定のOSはWindowsXP Proです。
自己解決しました。
部屋の状態をAccessのMDBで管理してるのですが、どうやらテーブルの更新遅延があったようで、処理そのものは正常だったようです。
更新遅延を見越してSendMessgageをPostMessageに変更し、Sleepで調整したら、思ったとおりの動作をするようになりました。
ツイート | ![]() |