2012-05-17 19 views
5

私はC++でVC2010を使用してWindows 7上で動作するデータ収集アプリケーションを用意しています。 1つのスレッドは、0.2秒ごとに変更を送信して約0.9秒のタイムアウトを持つハードウェアを保持するハートビートです。通常、ハートビートコールには10〜20msかかり、スレッドは残りの時間をスリーピングに費やします。通常の優先順位プロセスで、単一スレッドの優先度を15以上に設定できますか?

ただし、1〜2秒の遅延があり、ハードウェアが一時的にシャットダウンします。ハートビートスレッドは、THREAD_PRIORITY_TIME_CRITICAL(通常の優先プロセスの場合は15)で実行されています。他のハードウェアを制御するためにDLLを使用していて、プロセスエクスプローラでレベル15で実行されているいくつかのスレッドを開始したことに気づいたにもかかわらず、他のスレッドは通常の優先順位で実行されています。

遅い私のアプリケーションの他のtheadsは、これが起こると同じ種類の遅延を見ている。私はかなりシンプルですが、ハートビートコードに対していくつかの最適化を行っていますが、時折起こっている不具合はまだ起きています。今私は、プロセス全体に対してREALTIME_PRIORITY_CLASSを指定せずに、このスレッドの優先度を15を超えて上げることができるのだろうかと思います。そうでない場合は、REALTIME_PRIORITY_CLASSを使用することに注意しなければならない短所はありますか? (このハートビートスレッド以外は、アプリケーションの残りの部分でリアルタイムのタイミングが必要ない)

(または、これらの減速を追跡する方法については誰にも分かりません。私のアプリやシステムの他のどこかに)。

更新:私は実際にAfxBeginThread呼び出しに31を渡すことはしませんでした。その値を無視し、THREAD_PRIORITY_TIME_CRITICALで取得する15の代わりに通常の優先順位にスレッドを設定します。

更新:ディスクデフラグツールの実行は、多くのスレッド遅延を引き起こす良い方法です。 REALTIME_PRIORITY_CLASSでプロセスを実行しても、THREAD_PRIORITY_TIME_CRITICAL(レベル31)でハートビートスレッドを実行しても役立たないようです。 (Pro Audio)

更新:ハートビートスレッドを「Pro Audio」としてスケジューリングすると、スレッドの優先度が15(Base = 1、Dynamic = 24)を超えるように動作しますが、そうではありません。デフラグが実行されているときには本当の違いがあるようです。私は減速の多くをディスクデフラグツールと関連付けることができ、毎週スキャンを止めました。まだいくつかの遅延を説明することはできませんので、5〜10秒のウォッチドッグタイムアウトまで増加させていきます。

+6

は、それは私をおびえさせる:

は、そうでなければ、あなたがカーネルの部品を不正な動作しているかどうかを伝えることができるソフトウェアがあります。 :)それは確かにRTOSではありません:http://en.wikipedia.org/wiki/Real-time_operating_system – HostileFork

+2

私はあなたの監視が厳格であると思います。 RTOSでは500msは十分ですが、Windowsでは15秒以下のものは危険です。ウォッチドッグを制御できる場合は、タイムアウトを長くするか、トリガーが一定数失った場合にのみシャットダウンするようにしてください。 – Fozi

+0

質問:ハードウェアがシャットダウンするまでの時間はどのくらいですか? – Fozi

答えて

4

可能であれば、優先度を上げても効果はありません。最優先の実行可能スレッドは常にプロセッサを取得します。

ほとんどの場合、割り込みを無効にしている間に拡張割り込み処理が発生している可能性があります。割り込みは、どのスレッドよりも高い優先度で効果的に動作します。

ビデオ、ネットワーク、ディスク、シリアル、USBなどの可能性があります。代替のドライバを選択的に無効にしたり、使用して、問題のシステムヘビテーションが影響を受けていないかどうかを確認します。一度それを見つけたら、それを防ぐ方法を考え出すことは、それが何であるかによって些細なものから不可能なものに及ぶかもしれません。

システムに関する知識がなければ、言うことは難しいです。 異なる PCで実行しようとしましたか?

+0

信頼の投票のために:)私はいくつかの異なるコンピュータで実行しているが、一般的に常に同じソフトウェアとドライバがインストールされている。私は、私が無効にして実行できるものについて考えていますが、問題が断続的に発生するため追跡が難しく、毎日または2日に起こっているようです。ありがとう! – jacobsee

+0

私はそれが違いを生むことを望んでいる理由は、この他のハードウェアdllはレベル15で7スレッドのうち5スレッドを持っていることです。しかし、あなたのようなハードウェア割り込みがあれば、それは助けにならないでしょう。 – jacobsee

0

私はCreateWaitableTimer()& SetWaitableTimer()を使用して、同じプリエンプションの問題があるかどうかを確認します。

1

正式には、REALTIME_PRIORITY_CLASSを持たないプロセスでREALTIMEスレッドを使用することはできません。

Unoficiallyあなたが文書化されていないNtSetInformationThread を参照して遊ぶことができる: http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/NtSetInformationThread.html

しかし、私はそれを試していないので、私はこれについての詳細情報を持っていません。

一方、前にも述べたように、スレッドのクォンタムが期限切れになるまでにOSが時間をかけることは決してありません。このような待ち時間の原因としては、よく記述されていないドライバーがいます。人々は、Windowsに関するプログラミングの質問に「ハートビート」と「安全上の理由からシャットダウン」のような言葉を使用する場合 http://www.thesycon.de/deu/latency_check.shtml

+0

レイテンシチェックは便利です - ありがとう! – jacobsee

+0

DPC遅延が大幅に増加するケースが見つかった場合は、DPC(遅延プロシージャコール)がユーザモードの何よりも高い「優先順位」(実際にはIRQL)で実行されるため、スレッド優先順位が役立ちません... – Jaka

関連する問題