先日のシリアル通信で悩んでいたときに作ったテストプログラムを、
いろいろな環境で動かしてみたときに発見した症状です。
エックスさん作のTCommXというコンポーネントを使ったプログラムを
使用していたところ、送信が始まらないという現象に遭遇しました。
検証したPCが7台程度と少ないのですが、再現したのは、なぜか Windows2000 のみ。
XP SP1とSP2, NT4.0, では正常に動作していましたし、2000でも動作しているPCもあります。
このコンポーネントは、送受信共に、スレッドを使っており、
> 送信時に別の処理を行うことができます。さらに、送信処理中に
> 送信しても、キューに溜まるだけで問題なく動作します。
(Helpより一部抜粋)
ということだったのですが、デバックしてみると、肝心の送信スレッドが
動作していないことがわかりました。
ところが、ステップ実行すると、正常に動作開始します。
結論としては、PostThreadMessage でメッセージ送信したメッセージが、
正しく処理されていなかったのが原因です。
MSのプラットフォームSDK
http://www.microsoft.com/JAPAN/developer/library/jpuipf/_win32_postthreadmessage.htm
によると、
> PostThreadMessage 関数を呼び出します。この関数が失敗した場合、
> Sleep 関数を呼び出し、もう一度 PostThreadMessage 関数を呼び出し
> ます。PostThreadMessage 関数が成功するまで、この作業を繰り返します。
(一部抜粋)
失敗する理由が、偶然なのかOSの仕様によるものなのか、環境に依存するものなのかわかりません。
ですが、これをふまえて、TCommTransThread.Execute メソッド内の
PostThreadMessage(〜);
を、
while not PostThreadMessage(〜) do Sleep(1);
と変更したところ、送信されるようになりました。
「このような報告は、@niftyのFdelphi会議室に」ということですが、
自分は、今では、@nifty会員ではありませんので不可能です。
ここに質問したついでに、発生したということで、ここで報告することにしました。
シリアル通信には、まだまだ見えないトラップが隠れていそうな雰囲気です。
解決済みの、報告でした^^
ツイート | ![]() |