Я создал компонент 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);
}
}
}
Любая помощь высоко ценится. Спасибо!