2011-04-07 59 views
0

我使用System.Threading.Thread在C#.NET 1.1中創建了一個Ticker組件(System.Windows.Forms.UserControl)。此代碼將從右向左滾動並從XML Feed中讀取數據。我們的主應用程序將使用視頻和其他進程運行該組件。限制C#.NET 1.1中Ticker組件的CPU使用率

測試沒有Ticker組件的應用程序會消耗55%的CPU最大值,但是,當集成Ticker組件時,它會高達95%。

我也嘗試過使用System.Windows.Forms.Timer,但結果是一樣的。

XML數據的解析僅由組分的初始化期間發生,並且這裏是示例代碼段將處理股票滾動:

Thread _mainThread; 

private void InitTickerThread() 
{ 
_panelHeadlines = (Panel) FindControl("panelHeadlines", this); 

if(_panelHeadlines != null) 
{ 
    _textWidth = _panelHeadlines.Size.Width; 
} 

_locXOffset = 0; 

_mainThread = new Thread(new ThreadStart(StartScrolling)); 
_mainThread.Name = "Main Ticker Thread"; 
_mainThread.Priority = ThreadPriority.Lowest; 
_mainThread.IsBackground = true; 
_mainThread.Start(); 
} 

private void StartScrolling() 
{ 
while(true) 
{ 
    lock(this) 
    { 
     _locXOffset -= 1; 


     if (_locXOffset < -_textWidth) //If entire ticker content has finished scrolling. 
     { 
      _locXOffset = 0; 
      _partnerCtr = 0; 

      Partner p = _arrListPartners[_partnerCtr] as Partner; 
      if(p != null) 
      { 
       pbPartnerLogo.Image = p.Logo; 
       _partnerContentWidth = p.ContentWidth - _offsetToChangeLogo; 
      } 
     } 
     else 
     { 
      if(_locXOffset < -_partnerContentWidth) 
      { 
       _partnerCtr++; 

       if(_arrListPartners.Count > 0) 
       { 
        if(_partnerCtr < _arrListPartners.Count) 
        { 
         Partner p = _arrListPartners[_partnerCtr] as Partner; 

         if(p != null) 
         { 
          pbPartnerLogo.Image = p.Logo; 
          _partnerContentWidth = p.ContentWidth - _offsetToChangeLogo; 
         } 
        } 
       } 
      } 
     } 


     _panelHeadlines.Location = new Point(_locXOffset, 0); 

     Invalidate(); 

     Thread.Sleep(20); 
    } 
} 
} 

任何幫助高度讚賞。謝謝!

+0

您的後臺線程每20ms執行一次工作,即每秒執行50次。我建議大幅度降低這一點。 – Lazarus 2011-04-07 08:52:46

+0

我實際上將其設置爲20ms,以達到所需的滾動速度。 – 2011-04-07 10:44:23

回答

0

每20毫秒重新繪製整個組件。這非常昂貴。我的建議是增加睡眠時間,和/或讓你的代碼更有效率。

+0

謝謝你們的回覆。我將其設置爲20毫秒,以實現滾動條的滾動速度要求。任何其他的選擇? – 2011-04-07 10:47:54

+0

是的,它一次移動超過1個像素,並降低頻率或者處理器利用率。 – Lazarus 2011-04-07 11:47:32

+0

是否可以提供一些代碼段樣本?這是否意味着我需要將_locXOffset減少到2或更高? – 2011-04-07 12:06:25

0

您確定要更新您的UI控件嗎?將消息發佈到前臺UI線程? (您的代碼示例不完整,所以我無法確定)

+0

調用InitTickerThread的方法只是解析xml數據,並將每個適當的文本放到LinkLabel中以使其可點擊。鏈接標籤被添加到Windows.Forms.Panel,並將該面板添加到控件。例如this.Controls.Add(pnlTickerItems); – 2011-04-07 10:54:29