Hohe Prozessorauslastung bei transparenten Hintergrund

24/01/2010 - 14:25 von Dirk Herwig | Report spam
Hallo,

ich habe mir einen Lauftext als Control gebastelt, welcher soweit auch ganz
gute Ergebnisse bringt. Nun habe ich mal versucht, den Hintergrund des
Controls transparent darzustellen - dabei geht die Prozessorauslastung bis
zu 80% (Core2Duo 2,53GHz). Stellenweise kann ich garnicht mehr auf das
Formular zugreifen. Wenn ich dann im Hauptformular noch ein Hintergrundbild
wàhle, ist es ganz vorbei mit dem Lauftext.

Hier mal das Control :

public Ticker()
{
InitializeComponent();
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);

timer = new System.Timers.Timer(tmInterval);
timer.Elapsed += new ElapsedEventHandler(Timer_Tick);
timer.Enabled = true;
}

delegate void TimerTickDel();
private void Timer_Tick(object source, ElapsedEventArgs e)
{
TickerTick();
}

public void TickerTick()
{
if (this.InvokeRequired)
{
TimerTickDel ttd = new TimerTickDel(TickerTick);
this.Invoke(ttd);
}
else
{
Invalidate();
}
}

protected override void OnPaintBackground(PaintEventArgs pevent)
{
base.OnPaintBackground(pevent);
}

protected override void OnPaint(PaintEventArgs e)
{
DrawScrollingText(e.Graphics);
base.OnPaint(e);
}

public void DrawScrollingText(Graphics canvas)
{
if (tickerart == TickerArt.Ticker)
textLine = this.Text;

SizeF stringSize = canvas.MeasureString(textLine, this.Font);

CalcTextPosition(stringSize); //Berechnet staticTextPosition,yPos

using (Brush tempForeBrush = new SolidBrush(this.ForeColor))
{
canvas.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
canvas.DrawString(textLine, this.Font, tempForeBrush,
staticTextPosition, yPos);
}
}

Aufruf des Control aus dem Formular:
private void LoadTicker()
{
this.SuspendLayout();
Ticker.Ticker ticker1 = new Ticker.Ticker();
ticker1.Location = new Point(10, 10);
ticker1.Size = new Size(1000, 100);
ticker1.ForeColor = Color.Red;
//ticker1.BackColor = Color.Yellow;
ticker1.BackColor = Color.FromArgb(0, 255, 255, 0);
ticker1.Font = new Font("Arial", 32);
ticker1.Text = "Lorem ipsum dolor sit amet, consetetur sadipscing
elitr.";
this.Controls.Add(ticker1);
this.ResumeLayout();
}

Vielleicht seht ihr noch Optimierungsmöglichkeiten?

Gruss

Dirk
 

Lesen sie die antworten

#1 Herfried K. Wagner [MVP]
04/04/2010 - 03:06 | Warnen spam
Hallo Dirk!

"Dirk Herwig" schrieb:
ich habe mir einen Lauftext als Control gebastelt, welcher soweit auch
ganz gute Ergebnisse bringt. Nun habe ich mal versucht, den Hintergrund
des Controls transparent darzustellen - dabei geht die Prozessorauslastung
bis zu 80% (Core2Duo 2,53GHz). Stellenweise kann ich garnicht mehr auf das
Formular zugreifen. Wenn ich dann im Hauptformular noch ein
Hintergrundbild wàhle, ist es ganz vorbei mit dem Lauftext.



Welches Intervall hast Du für die Aktualisierung eingestellt?

public Ticker()
{
InitializeComponent();
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);

timer = new System.Timers.Timer(tmInterval);
timer.Elapsed += new ElapsedEventHandler(Timer_Tick);
timer.Enabled = true;
}

delegate void TimerTickDel();
private void Timer_Tick(object source, ElapsedEventArgs e)
{
TickerTick();
}

public void TickerTick()
{
if (this.InvokeRequired)
{
TimerTickDel ttd = new TimerTickDel(TickerTick);
this.Invoke(ttd);
}
else
{
Invalidate();
}
}

protected override void OnPaintBackground(PaintEventArgs pevent)
{
base.OnPaintBackground(pevent);
}

protected override void OnPaint(PaintEventArgs e)
{
DrawScrollingText(e.Graphics);
base.OnPaint(e);
}

public void DrawScrollingText(Graphics canvas)
{
if (tickerart == TickerArt.Ticker)
textLine = this.Text;

SizeF stringSize = canvas.MeasureString(textLine, this.Font);

CalcTextPosition(stringSize); //Berechnet staticTextPosition,yPos

using (Brush tempForeBrush = new SolidBrush(this.ForeColor))



Auch wenn dies keine große Änderung bringt, aber den Pinsel könntest Du z.B.
in einer privaten Variablen zwischenspeichern und nicht bei jeder
Aktualisierung neu erstellen.

Anstelle von 'System.Timers.Timer' würde wohl auch
'System.Windows.Forms.Timer' vollkommen ausreichen. Dann ersparst Du Dir
auch das Marshalling zwischen dem Thread des Zeitgebers und dem
Benutzerschnittstellenthread.

M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Ähnliche fragen