在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);
}
}
}
非常感谢任何帮助。谢谢!
每隔20毫秒你就要重新绘制整个组件。这非常昂贵。我的建议是增加睡眠时间,或者让你的代码更有效率。
你确定你正在更新你的UI控件通过发送消息到前台UI线程?(你的代码样本不完整,所以我不能真的告诉)