Windowsのシリアルポートタスクを実行しているQtアプリケーション(Qt 4.8.1)があります。シリアルポートを開くために行うCreateFileAコールが完了するまでに30秒以上かかることがあることがあります。明らかに、私はこの奇妙な行動を引き起こす何かをしています、そして、私はこれを引き起こすために何が起こっているのか知りたいと思います。シリアルポート上でCreateFile呼び出しが非常に遅くなる原因は何ですか?
m_portHand = CreateFileA(portDevice.c_str(),
GENERIC_READ | GENERIC_WRITE,
0, // must be opened with exclusive-access
NULL, // default security attributes
OPEN_EXISTING, // must use OPEN_EXISTING
FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL); // hTemplate must be NULL for comm devices
m_portHandはハンドルであり、portDeviceはstd :: stringであり、 "COM5"を含みます。
この呼び出しは、アプリケーションのメインスレッドのボタンプッシュによってトリガーされます。当時、アプリはたかだか他のスレッドを1つしか持っていませんでしたが、それらのスレッドがあればそれはアイドルです。
システムで起こっている唯一の主なものは、Linuxを実行しているVMですが、システムはクアッドコアであり、コアのうち3つはWindowsのボックスに表示されているようにアイドルに近いものですVMとの接続
シリアルポートは8ポートUSBシリアルボックスにありますが、それは関連する可能性がありますか?
これは、何らかの方法でオーバーラップIOに関連していますか?コメントに応えて
:
ポートが別のアプリケーションによって開かれていません。ポートは以前にこのアプリケーションの以前の呼び出しによって開かれていましたが、これは正しく閉じられていて、ポートは 'CloseHandle'で閉じられました。
私は30秒を要している間の相関関係を特定できませんでした - 時々私はアプリケーションを起動し、ボタンをクリックしてレースに出ます。時には30秒かかることもあります。
VMは、同じシリアルボックス上の他のいくつかのUSBデバイスをインターセプトしています。
シリアルボックス(VMをポーリングしてデバイスを探す4つのポート)以外は、USBバスがアンロードされます。
他のアプリでの動作は見ていません。内蔵ポート(マザーボード上のCOM1)に切り替えて、それが何らかの効果を持っているかどうかを確認します。
私の考えはちょうど私に起こりました:ポートアドレシングの形式は、それと関係がありますか?私が作業しているその他の同様のアプリケーションは、 '\\。\ COM#'表記を使用してポートを開くqestserialportライブラリを使用します。使用されている表記がタイミングに影響を与える可能性がありますか?
USBシリアルデバイスには「VScom」と表示され、通常はすぐに開きます(<はCreateFile呼び出しで10ミリ秒)。物事が詰まってしまうのはたまに問題になるだけで、私はこのような現象を起こしていないようなプログラムもあります。
私が話しているデバイスは、IEEE 11073プロトコルを使った医療用モニターです。とにかく、私はデバイスに接続するだけで正常に動作している、それは問題のシリアルポートを開いているだけです。オープン時のシリアル制御線の状態はこれと何か関係がありますか?他の端末のデバイスは、さまざまなものを探してポートをポーリングしているので、問題が起こったときにシリアルラインがどのように見えるかはわかりません。
ポートは別のアプリケーションによって開いていますか? mutexやロックが解放されるのを待っているのかもしれません。 –
あなたが表示する 'CreateFileA()'呼び出しはOKと思われます。どのような状況で30秒かかるのですか?あなたのUSBデバイスを差し込んだ直後?あなたは他のアプリケーションでこの動作をしようとしましたか?別のCOMポートでこの動作をしようとしましたか?あなたのUSBバスはどのくらいビジーですか? VMがUSBデバイスを傍受していますか? – tinman
多くのUSB COMポートが接続されていても、私の経験ではシリアルポートはかなり速く開いています。使用しているUSBシリアルポートはどのブランドですか? –