Как заставить перерисовать запись моего приложения на панели задач? - PullRequest
3 голосов
/ 19 декабря 2008

У меня есть приложение для Windows, написанное на C #. Я часто обновляю заголовок формы, но между изменением заголовка и заголовком, отображаемым на обновляемой панели задач, существует значительный разрыв.

Какой чистый способ принудительно обновить / перерисовать запись панели задач для моей программы? В противном случае, как я могу вызвать перерисовку всей панели задач?

Разработка: Оказывается, что задержка обновления панели задач зафиксирована на уровне около 100 мс, однако, похоже, это задержка, основанная на том, когда последний раз был изменен Form.Text. Если вы изменяете текст быстрее, чем, скажем, каждые 10 мс, панель задач не обновляется до тех пор, пока Form.Text не будет изменен в течение как минимум ~ 100 мс.

ОС: Vista 32.

Ответы [ 4 ]

2 голосов
/ 03 января 2009

Обновление панели задач более чем каждые 100 мсек будет слишком быстрым для пользователя, чтобы все равно разрешить. Предположительно, вы показываете какой-то индикатор прогресса или статуса пользователю?

Если это так, вы наносите вред приложению без необходимости делать так много обновлений пользовательского интерфейса. Это время обработки лучше использовать для выполнения работы клиента.

Я думаю, вам нужно пересмотреть аспекты дизайна пользовательского интерфейса того, что вы пытаетесь сделать.

2 голосов
/ 19 декабря 2008

Вы пытались вызвать Form.Refresh () после обновления заголовка?

Edit:

Если вы обновляете заголовок в цикле, вам может потребоваться сделать что-то вроде:

        this.Invalidate();
        this.Update();
        Application.DoEvents();
1 голос
/ 03 января 2009

Используете ли вы код, подобный этому в вашей форме?:

    private void Form1_Load(object sender, EventArgs e)
    {
        Timer t = new Timer();
        t.Interval = 10;
        t.Tick += new EventHandler(t_Tick);
        t.Start();
    }

    int aa = 0;

    void t_Tick(object sender, EventArgs e)
    {
        this.Text = aa++.ToString();
    }

У меня отлично работает - вообще нет лага между формой и панелью задач.

Вы уверены, что не блокируете поток графического интерфейса и не вызываете Application.DoEvents в цикле?

Я использую новую бета-версию Windows 7, так что маловероятно, что это другое поведение.

1 голос
/ 19 декабря 2008

Я только что сделал простой тест. Изменения происходят мгновенно. Судя по всему, это определенно меньше 500 мс. Если вам нужно обновить заголовок с большей скоростью, я не буду этого рекомендовать. Обычно я видел самую быструю частоту обновления в два раза в секунду.

EDIT: Я тестировал с помощью события нажатия клавиши. Когда я удерживаю клавишу для быстрого повтора, она не будет обновляться, пока я не отпущу свою клавишу. Таким образом, тот же сценарий, что и ваши настройки.

Кстати, зачем вам обновляться каждые 10 мс? Просто имейте в виду, что Thread.Sleep(timeout) с таймаутом менее 50 мс не является точным. Кроме того, тайм-аут 10 мс будет равен 100 Гц, если вы не используете дисплей высокого класса, вы пропустите несколько кадров. Большинство обычных ЖК-дисплеев имеют частоту обновления 60 Гц. И наш глаз не может различить ничего быстрее, чем 25 Гц. Таким образом, задержка 40 мс более чем достаточно, если вы хотите анимировать. Обычно я бы рекомендовал 15 Гц (67 мс) для простой анимации. Если просто хотите прокрутить текст, 2 Гц более чем достаточно. Что-нибудь быстрее вызовет головокружение у пользователя.

...