Обновление приложения Windows Forms при сворачивании - PullRequest
2 голосов
/ 27 ноября 2009

У меня есть приложение для форм Windows, где я добавляю mainloop в конструктор формы следующим образом:

Application.Idle += new EventHandler(Update);

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

Ответы [ 3 ]

3 голосов
/ 27 ноября 2009

Вы можете вызвать его из System.Threading.Timer. Либо запустите Таймер, когда вы свернетесь, либо просто дайте ему поработать (с низкой частотой) и проверьте Minimized перед вызовом Update.

Редактировать на основе комментариев

Самый разумный способ сделать это - запустить код Update из другого потока. Решения Idle-Event или Timer столкнутся с проблемами.

Но с потоком вы должны быть осторожны при прикосновении к любому элементу управления пользовательского интерфейса. Простой подход - BackgroundWorker . Он имеет события Completed и Progress, которые выполняются поточно-ориентированно.

1 голос
/ 28 ноября 2009

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

Итак, установите время задержки, скажем, 50 мс, и кодируйте обработчик событий следующим образом:

private void timer1_Tick(object sender, EventArgs e)
{
    if ((this.WindowState == FormWindowState.Minimized) && !_isProcessing)
    {
        _isProcessing = true;

        // Do stuff

        _isProcessing = false;
    }
}

где _isProcessing - это частная логическая переменная в вашей форме.

Если вы ожидаете, что операции будут занимать менее 50 мс каждая, то каким-то образом агрегируйте операции (возможно, подойдет очередь).

0 голосов
/ 27 ноября 2009

Я бы попробовал это, чтобы быть уверенным, но мое первое предположение - подключить событие Resize формы, а в обработчике проверить, не свернута ли форма ...

...