2010-12-15 56 views
1

的我目前正在研究的是注入消息轉換成經由COM的應用的側由端應用(C#,的WinForms)。缺貨PROC COM呆滯

本申請使用多個的foreach聲明,從接受COM應用輪詢實體的指標。 ListBox用於列出每個實體,當用戶從該列表中選擇一個時,將創建並執行一個線程,調用一個檢索所需數據的方法。

當用戶從列表中選擇一個不同的實體,正在運行的線程被中止並且爲新選擇的實體創建一個新的線程。

我花了一天尋找到我的線程和內存使用情況,並得出一個結論,一切都很好。從來沒有超過6個線程同時運行(所有執行不同成員都是唯一的),並且通過Windows任務管理器,我的應用程序從未達到峯值> 10 CPU%,29M MEM。

回答

2

想到的唯一情況是您正在使用的COM對象被設計爲在單線程單元(STA)中運行。如果是這種情況,那麼你開始有多少線程無關緊要;當調用這個COM對象時,它們最終都會被序列化。如果你的機器有多個核心,那麼你肯定會看到少於100%的使用率。 10%似乎非常低。我不會驚訝地發現25%左右的東西基本上代表了四核心繫統的一個掛鉤核心,但是10%的數字可能需要另一個解釋。如果您的代碼或COM對象本身正在等待IO操作完成,那麼可能會解釋更多的低吞吐量。

0

你沒有提到什麼是緩慢的,所以這是很難說有把握什麼。然而,既然你說你插入項目到一個列表框中,我會做一個完整的猜測並詢問每次有多少項目?將大量項目插入列表框可能會非常緩慢。

如果是這樣的話,你可以通過代替在一個列表框中列出每個實體來加速它,只在列表中列出一組類別,然後當用戶選擇一個類別時,你將填充另一個列表框,該類別。

+0

謝謝領先; ListBox包含不確定數量的實體..通常它包含大約5-15。 – wulfgarpro 2010-12-15 10:02:34

+0

@wulfgarpro:聽起來似乎不太重要。但是,如果你一直在更新很多控件,乍得的答案可能對你有用。 – 2010-12-15 10:38:43

2

在的WinForms,你可以做SuspendLayout()ResumeLayout()。如果你插入了很多項目(或者通常做很多屏幕更新),你將首先調用SuspectLayout(),然後執行所有更新,然後執行ResumeLayout()。

+0

這可能是問題;數據不斷更新TabControl中的一組8個文本框(每個文本框都指通過COM輪詢的數據)。你認爲這可能是由於速度問題? – wulfgarpro 2010-12-15 10:04:22

+0

@wulfgarpo - 我認爲這是對它的貢獻,我不明白它是如何可能會傷害嘗試這個看看是否有幫助。但是,我不知道這是不是最大的原因。 – Chad 2010-12-15 10:10:15

+0

嗯,我會試試這個(不能在家工作)。我還將介紹該應用程序,看看是否可以找到任何瓶頸循環。我會及時向大家發佈! – wulfgarpro 2010-12-15 10:15:50