Избегать метки «(не отвечает)» в окнах при обработке большого количества данных одним комком - PullRequest
12 голосов
/ 31 декабря 2008

Мне иногда нужно обрабатывать большой объем данных из одного пакета вне сети, что занимает достаточно много времени, чтобы при попытке пользователя взаимодействовать с окнами приложения в заголовок окна добавлялась строка «(не отвечает)». Я знаю, что это потому, что обработка выполняется в вызове для обработки сообщения (каким-то образом вверх по стеку) и, следовательно, блокирует рассылку сообщений. Я также знаю, что идеальный способ справиться с этим - это асинхронно обрабатывать данные в отдельном потоке, чтобы насос мог продолжать работу, однако это БОЛЬШОЕ настольное приложение, которое является однопоточным сверху вниз и безопасно отбрасывает эту обработку невозможно в наше время.

Итак, с учетом этого, есть ли какой-нибудь шанс, которым я могу, по крайней мере, избежать "не отвечающего" прозвища (которое большинство пользователей читает как "сбой"), сообщая windows, что мое приложение собирается быть занятым до того Я начинаю работу? Я полагаю, что что-то в этом роде, когда отвечаешь на запрос о закрытии, можно продолжать просить у окон больше времени, чтобы избежать объявления о том, что ты не "закрываешься своевременно"

Я должен добавить, что это приложение C ++ MFC.

Ответы [ 11 ]

0 голосов
/ 28 февраля 2018

Я столкнулся с точной той же проблемой. Поскольку я не считаю другие ответы привлекательными / простыми, я решил опубликовать это.

Краткое описание и некоторый контекст: Я сохраняю данные из сетки в базу данных, и этот процесс может занять некоторое время. Поэтому я изменил метод сохранения на асинхронный, и у меня возникла та же проблема.

Тогда я пришел к простому решению:

//__ENABLE OR DISABLE MAIN DIALOG
void CMFCApplication1Dlg::enableMainDlg(bool enable)
{ 
    this->EnableWindow(enable);
}

При запуске асинхронного метода я отключаю главное диалоговое окно. Это предотвращает взаимодействие пользователя с основным диалоговым окном (например, запуск другого процесса сохранения, который может привести к тысячам сообщений об ошибках SQL, если я не проверю, запущен ли процесс сохранения ...)

Когда процесс сохранения закончится, я снова включаю главное диалоговое окно. Работает как шарм, надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...