2012-05-17 80 views
5

我有一個運行在Windows 7上的數據採集應用程序,使用C++中的VC2010。一個線程是一個心跳,它每隔0.2秒發出一次更改以保持某些硬件的超時時間約爲.9秒。通常情況下,心跳呼叫需要10-20毫秒,並且線程花費其餘時間休眠。對於普通優先級進程,我可以將單個線程的優先級設置爲15以上嗎?

但是偶爾會有1-2秒的延遲,硬件會暫時關閉。心跳線程在THREAD_PRIORITY_TIME_CRITICAL上運行,對於正常優先級進程,該值爲15。我的其他線程以正常優先級運行,儘管我使用DLL來控制一些其他硬件,並且已經注意到使用Process Explorer啓動了多個運行在級別15的線程。

我無法追查慢速但在我的應用程序中的其他角色在發生這種情況時會看到相同類型的延遲。我已經對心跳代碼進行了幾次優化,儘管它很簡單,但偶爾的故障仍在發生。現在我想知道如果沒有爲整個過程指定REALTIME_PRIORITY_CLASS,我是否可以將該線程的優先級提高到15以上。如果不是,我是否應該注意使用REALTIME_PRIORITY_CLASS有什麼缺點? (除了這個心跳線程,應用程序的其餘部分沒有實時定時需求。)

(或沒有人有任何關於如何追蹤這些減速的想法...不知道源是否可以在我的應用程序或系統中的其他地方)。

更新:所以我還沒有真正嘗試通過31進我AfxBeginThread電話,原來它忽略了價值,並設置線程正常優先級,而不是15,我與THREAD_PRIORITY_TIME_CRITICAL得到。

更新:發現運行磁盤碎片整理程序是導致大量線程延遲的好方法。即使在REALTIME_PRIORITY_CLASS和THREAD_PRIORITY_TIME_CRITICAL(31級)的心跳線程上運行該進程似乎也沒有幫助。接下來的事情,試圖呼籲AvSetMmThreadCharacteristics(「專業音響」)

更新:調度心跳線爲「專業音響」做工作,以增加超過15線程的優先級(基地= 1,動態= 24),但它不似乎在碎片整理運行時會產生真正的差異。我已經能夠將磁盤碎片整理程序的許多減速與關閉每週掃描相關聯。仍然無法解釋一些延遲,所以我們將增加到5-10秒的看門狗超時。

+6

當人們在有關Windows編程問題,使用像「心跳」和「關閉出於安全原因」的話它讓我害怕。 :)這當然不是一個RTOS:http://en.wikipedia.org/wiki/Real-time_operating_system – HostileFork

+2

我認爲你的看門狗是嚴格的。在RTOS上500ms很多,但在Windows上15秒以下是有風險的。如果你對你的看門狗有控制權,那麼我建議讓超時時間更長,或者只有當它失去了一定數量的觸發器時才讓它關閉。 – Fozi

+0

問題:什麼時候您的硬件將關閉? – Fozi

回答

4

即使可以,增加優先級也無濟於事。最高優先級的可運行線程始終獲取處理器。

當中斷被禁用時,最有可能發生一些擴展中斷處理。中斷有效地工作在比任何線程更高的優先級。它可能是視頻,網絡,磁盤,串口,USB等,這需要一些洞察力來選擇性地禁用或使用替代驅動程序來查看問題系統猶豫是否受到影響。一旦你發現這一點,然後找出一種方法來防止它可能從微不足道到不可能取決於它是什麼。

沒有關於系統的更多知識,很難說。你有沒有試過在不同的電腦上運行它?

+0

感謝您的信任投票:)我已經運行在幾臺不同的計算機上,但通常都安裝了相同的軟件和驅動程序。我會考慮我可以禁用和運行的內容,但由於問題是間歇性的,因此很難追查,似乎每隔一兩天就會發生一次。謝謝! – jacobsee

+0

我希望它會有所作爲的原因是,這個其他硬件DLL在15級的線程中有7個線程中有5個。當事情變得忙碌時,我寧願我的線程優先於它們。但是,如果這是一個硬件中斷,就像你建議的那樣不起作用。 – jacobsee

0

我會嘗試使用CreateWaitableTimer()& SetWaitableTimer()並查看它們是否受制於相同的搶佔問題。

1

正式情況下,您不能在沒有REALTIME_PRIORITY_CLASS的進程中使用REALTIME線程。

Unoficially你可以與無證NtSetInformationThread 查看Google Play: http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/NtSetInformationThread.html

但因爲我還沒有嘗試過,我不會對此有任何詳細信息。另一方面,正如之前所說的,當你的線程的量子過期時,你永遠無法確定操作系統不會花費時間。某些寫得不好的驅動程序往往是造成這種延遲的原因。

否則,有一個軟件,它可以告訴你,如果你行爲不端的核心部分: http://www.thesycon.de/deu/latency_check.shtml

+0

延遲檢查看起來很有用 - 謝謝! – jacobsee

+0

如果您發現DPC延遲急劇增加的情況,那麼由於DPC(延遲過程調用)以高於「優先級」(在現實中爲IRQL)運行,線程優先級不能幫助您 – Jaka