在c# . net 1.1中限制Ticker组件的CPU使用

本文关键字:组件 CPU 使用 Ticker net | 更新日期: 2023-09-27 17:48:58

我使用System.Threading.Thread在c# . net 1.1中创建了一个Ticker组件(System.Windows.Forms.UserControl)。这个计时器将从右向左滚动并从xml提要读取数据。这个组件将被我们的主应用程序调用,并运行视频和其他进程。

测试不使用ticker组件的应用程序所消耗的CPU最多为55%,然而,当集成ticker组件时,CPU消耗高达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);
    }
}
}

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

在c# . net 1.1中限制Ticker组件的CPU使用

每隔20毫秒你就要重新绘制整个组件。这非常昂贵。我的建议是增加睡眠时间,或者让你的代码更有效率。

你确定你正在更新你的UI控件通过发送消息到前台UI线程?(你的代码样本不完整,所以我不能真的告诉)