Обновление приложения Windows Forms при сворачивании

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

Application.Idle += new EventHandler(Update);

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


person genesys    schedule 27.11.2009    source источник


Ответы (3)


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

Изменить на основе комментариев

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

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

person Henk Holterman    schedule 27.11.2009
comment
На самом деле я просто хочу, чтобы моя основная процедура обновления выполнялась непрерывно. Если я создам цикл while(true){} в основной функции программы, я столкнусь с исключением Out of Memory, так как кажется, что тогда сборщик мусора не вызывается. - person genesys; 27.11.2009
comment
Таймер имеет разрешение ~ 20 мс, если это приемлемо, я бы использовал его и забыл о простое. Но похоже, что таким образом вы сжигаете много процессорного времени. Я бы не хотел, чтобы это на моем ноутбуке. - person Henk Holterman; 27.11.2009
comment
Я хочу, чтобы функция вызывалась как можно чаще, так как она обрабатывает некоторые изображения и это должно происходить быстро (как можно быстрее) - person genesys; 27.11.2009
comment
что произойдет, если я использую System.threading.Timer со временем, которое меньше, чем функция действительно требуется для выполнения? - person genesys; 27.11.2009

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

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

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

        // Do stuff

        _isProcessing = false;
    }
}

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

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

person Jon Seigel    schedule 27.11.2009

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

person Charles Bretana    schedule 27.11.2009
comment
Вопрос: в то время как минимизируется. Не при сворачивании. - person Henk Holterman; 27.11.2009
comment
@ Хенк, ОП говорит, что это не работает, когда я сворачиваю окно приложения, а потом он говорит ... вызывается также, когда окно свернуто, поэтому мне было / не ясно, что его интересует ... Учитывая, что есть кажется, мало или вообще нет причин делать обновления, когда пользовательский интерфейс свернут (что может вызвать обновление ??). Я предположил, что он имел в виду, когда он был сведен к минимуму... - person Charles Bretana; 28.11.2009