在C#.NET 1.1中限制Ticker组件中的CPU使用率

时间:2011-04-07 08:46:35

标签: c# .net winforms .net-1.1

我使用System.Threading.Thread在C#.NET 1.1中创建了一个Ticker组件(System.Windows.Forms.UserControl)。此自动收录器将从右向左滚动并从xml Feed中读取数据。我们的主应用程序将使用视频和其他正在运行的进程调用此组件。

在没有自动收报机组件的情况下测试应用程序会消耗最多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);
    }
}
}

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

每20毫秒重绘整个组件。这非常昂贵。我的建议是增加睡眠,和/或提高代码效率。

答案 1 :(得分:0)

您确定通过向前台UI线程发布消息来更新UI控件吗? (你的代码示例不完整,所以我无法真正说出来)