Ограничение использования процессора в компоненте тикера в C # .NET 1.1 - PullRequest
0 голосов
/ 07 апреля 2011

Я создал компонент Ticker (System.Windows.Forms.UserControl) в C # .NET 1.1, используя System.Threading.Thread. Этот тикер будет прокручиваться справа налево и читать данные из XML-канала. Этот компонент будет вызываться нашим основным приложением с видео и другими запущенными процессами.

Тестирование приложения без компонента тикера потребляет максимум 55% ресурсов ЦП, однако при интеграции компонента тикера оно возрастает до 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 голосов
/ 07 апреля 2011

Вы уверены, что обновляете свой элемент управления пользовательским интерфейсом, публикуя сообщения в основном потоке пользовательского интерфейса? (ваш пример кода не завершен, поэтому я не могу сказать точно)

0 голосов
/ 07 апреля 2011

Каждые 20 миллисекунд вы перерисовываете весь свой компонент. Это очень дорого. Мой совет - увеличить сон и / или сделать ваш код более эффективным.

...