бегущяя строка потребляет 100% CPU!!!(
От: Аноним  
Дата: 18.12.07 15:50
Оценка: :))
сделал бегущюю строку,взял Panel ну и на нее кидаю label,которые потом двигаю label.Left,двигаю циклически, тоесть когда какой-то label ушел из поля видимости помещая его за тем, за которым он шел,проблема в том, что если добавляю более 20 таких label,строка начинает потреблять 100% CPU, так вот не могу понять из-за чего такое может быть ?!( подскажитеЮ если кто знает, наверняка же кто нибудь писал бегущюю строку !
Re: бегущяя строка потребляет 100% CPU!!!(
От: Hike  
Дата: 18.12.07 16:18
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>сделал бегущюю строку,взял Panel ну и на нее кидаю label,которые потом двигаю label.Left,двигаю циклически, тоесть когда какой-то label ушел из поля видимости помещая его за тем, за которым он шел,проблема в том, что если добавляю более 20 таких label,строка начинает потреблять 100% CPU, так вот не могу понять из-за чего такое может быть ?!( подскажитеЮ если кто знает, наверняка же кто нибудь писал бегущюю строку !


Проблемв в том что ты изменяешь свойство, а свойство — это вызов метода, который делает много работы.
Я бы вообще отказался от Label, и просто рисовал бы на контроле.

Что тебе мешает создать свой контрол, примерно вот так. Это вариант будет просто летать.

public class Foo : System.Windows.Forms.Control
        {
            protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
            {
                e.Graphics.DrawString("foo", ..., x, y);

                base.OnPaint(e);
            }
        }


не забудь добавить перерисовку по таймеру (ивалидэйт), чтобы двигались твои бегущие строки.
Используй таймер из винформс.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[2]: бегущяя строка потребляет 100% CPU!!!(
От: Аноним  
Дата: 19.12.07 16:26
Оценка:
Здравствуйте, Hike, Вы писали:

H>Здравствуйте, <Аноним>, Вы писали:


А>>сделал бегущюю строку,взял Panel ну и на нее кидаю label,которые потом двигаю label.Left,двигаю циклически, тоесть когда какой-то label ушел из поля видимости помещая его за тем, за которым он шел,проблема в том, что если добавляю более 20 таких label,строка начинает потреблять 100% CPU, так вот не могу понять из-за чего такое может быть ?!( подскажитеЮ если кто знает, наверняка же кто нибудь писал бегущюю строку !


H>Проблемв в том что ты изменяешь свойство, а свойство — это вызов метода, который делает много работы.

H>Я бы вообще отказался от Label, и просто рисовал бы на контроле.

H>Что тебе мешает создать свой контрол, примерно вот так. Это вариант будет просто летать.


H>
H>public class Foo : System.Windows.Forms.Control
H>        {
H>            protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
H>            {
H>                e.Graphics.DrawString("foo", ..., x, y);

H>                base.OnPaint(e);
H>            }
H>        }
H>


H>не забудь добавить перерисовку по таймеру (ивалидэйт), чтобы двигались твои бегущие строки.

H>Используй таймер из винформс.

сделал так

public class RunLabel : Control
            {
                private string Text;
                public string LblText
                {
                    get { return this.Text; }
                    set { this.Text = value; }
                }
                public RunLabel()
                {
                    SetStyle(ControlStyles.AllPaintingInWmPaint, true);
                    SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
                }
                public int LblLeft
                {
                    get { return this.Left; }
                    set 
                    { 
                        this.Left = value;
                        this.Refresh();
                    }
                }

                protected override void OnPaint(PaintEventArgs e)
                {
                    e.Graphics.DrawString(this.Text, Font, new SolidBrush(ForeColor), this.Location.X, this.Location.Y);
                    base.OnPaint(e);
                }
            }

когда вызываю LblLeft доходит до Refresh, только OnPaint не вызывается, подскажите, в чем дело (((
Re[3]: бегущяя строка потребляет 100% CPU!!!(
От: Vovstehn  
Дата: 19.12.07 18:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>сделал так


А>
А>public class RunLabel : Control
А>            {
А>                private string Text;
А>                public string LblText
А>                {
А>                    get { return this.Text; }
А>                    set { this.Text = value; }
А>                }
А>                public RunLabel()
А>                {
А>                    SetStyle(ControlStyles.AllPaintingInWmPaint, true);
А>                    SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
А>                }
А>                public int LblLeft
А>                {
А>                    get { return this.Left; }
А>                    set 
А>                    { 
А>                        this.Left = value;
А>                        this.Refresh();
А>                    }
А>                }

А>                protected override void OnPaint(PaintEventArgs e)
А>                {
А>                   e.Graphics.DrawString(this.Text, Font, new SolidBrush(ForeColor), this.Location.X, this.Location.Y);
А>                    base.OnPaint(e);
А>                }
А>            }
А>

А>когда вызываю LblLeft доходит до Refresh, только OnPaint не вызывается, подскажите, в чем дело (((

Может лучше вот так:
base.OnPaint(e);
e.Graphics.DrawString(this.Text, Font, new SolidBrush(ForeColor), this.Location.X, this.Location.Y);

Re[4]: бегущяя строка потребляет 100% CPU!!!(
От: Vovstehn  
Дата: 19.12.07 18:59
Оценка:
Здравствуйте, Vovstehn, Вы писали:
A>> skipped
Хотя нет, не туда посмотрел, там все правильно.
Дело скорее всего тут:
e.Graphics.DrawString(this.Text, Font, new SolidBrush(ForeColor), this.Location.X, this.Location.Y);
Ты меняешь позицию самого контрола, и графиксом рисуешь с отступлением, вот он у тебя и вылазит за пределы видимости.
У тебя сам метод OnPaint не вызывается? или просто не видны результаты?
Re[5]: бегущяя строка потребляет 100% CPU!!!(
От: Аноним  
Дата: 20.12.07 13:57
Оценка:
Здравствуйте, Vovstehn, Вы писали:

V>Здравствуйте, Vovstehn, Вы писали:

A>>> skipped
V>Хотя нет, не туда посмотрел, там все правильно.
V>Дело скорее всего тут:
V>e.Graphics.DrawString(this.Text, Font, new SolidBrush(ForeColor), this.Location.X, this.Location.Y);
V>Ты меняешь позицию самого контрола, и графиксом рисуешь с отступлением, вот он у тебя и вылазит за пределы видимости.
V>У тебя сам метод OnPaint не вызывается? или просто не видны результаты?
именно OnPaint не вызывается, не понимаю в чем дело, ведь должен же (((!!
Re[6]: бегущяя строка потребляет 100% CPU!!!(
От: Aen Sidhe Россия Просто блог
Дата: 20.12.07 15:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Vovstehn, Вы писали:


V>>Здравствуйте, Vovstehn, Вы писали:

A>>>> skipped
V>>Хотя нет, не туда посмотрел, там все правильно.
V>>Дело скорее всего тут:
V>>e.Graphics.DrawString(this.Text, Font, new SolidBrush(ForeColor), this.Location.X, this.Location.Y);
V>>Ты меняешь позицию самого контрола, и графиксом рисуешь с отступлением, вот он у тебя и вылазит за пределы видимости.
V>>У тебя сам метод OnPaint не вызывается? или просто не видны результаты?
А>именно OnPaint не вызывается, не понимаю в чем дело, ведь должен же (((!!

Если контрол невидим (скрыт другим или уполз куда) — OnPaint вызываться не будет — зачем, если его не видно?
С уважением, Анатолий Попов.
ICQ: 995-908
Re: бегущяя строка потребляет 100% CPU!!!(
От: Аноним  
Дата: 20.12.07 22:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>сделал бегущюю строку,взял Panel ну и на нее кидаю label,которые потом двигаю label.Left,двигаю циклически, тоесть когда какой-то label ушел из поля видимости помещая его за тем, за которым он шел,проблема в том, что если добавляю более 20 таких label,строка начинает потреблять 100% CPU, так вот не могу понять из-за чего такое может быть ?!( подскажитеЮ если кто знает, наверняка же кто нибудь писал бегущюю строку !


во первых — каждый новый объект на форме это относительно крупный кусок памяти и цпу,
во вторых — при передвижении вызывается метод перерисовки, в твоем случае скорее всего для всех 20 лабел
проще создать просто один лабел и какую-нибудь строку буфер, а потом удалять одну букву в начале и прибавлять в конце
будет лучше, если сделать это в отдельном потоке и установкой времени спячки потока можно будет регулировать скорость строки
но это тоже не лучший вариант. зато простой.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.