2011-04-07 75 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