Я лінуксоід, і вже натякав на це в інших постах. Але я роблю програми не тільки для використання в середовищі Linux, а й для Windows. Велика частина з того, що я робив первинно була написана саме в Linux, а вже потім перенесена в Windows. Тестуючи програми в обох системах, маю зазначити таку неприємну особливість Windows. При виконанні тривалого процесу, вікно програми зависає. Запускаючи той же самий процес в Linux, принаймні на Ubuntu, такого не трапляється.
Наведу невеличкий приклад. Потрібно витягнути з файлу декілька рядків.
Звичайно, читаючи 20 рядків користувач нічого не помітить. Але я стикався з завданнями, коли обробити потрібно 15 або навіть більше 40 тисяч рядків. І в такому процесі виникає тимчасове "зависання" вікна. Вікно на будь-які дії не відповідає, а іноді Windows просто показує, що програма зависла. Якщо прогресс не відображається, найчастіше, сторонній користувач в диспетчері задач просто "вбиває" процес. Насправді ж процес обробки даних триває в штатному режимі, і результат, незважаючи на тимчасове зависання, буде коректно відображено після виконання всіх дій.
Цікаво, що зависання таке, може і не виникнути. Але якщо в час виконання подібної операції ви вирішили змінити, скажімо, розмір вікна або перемістити його, у вас нічого не вийде.
Є два рішення подібної проблеми. Перша - це розділити операції на потоки, правильне рішення для масштабних, навантажених процесів. У нашому ж випадку, можна обійтися включенням QApplication :: processEvents () в основний цикл и все буде гаразд.
QList list;
for (int x = 0; x < list.count(); x++) {
...
ui.progressBar->setValue(qFloor((x + 1) * 100 / list.count()));
QApplication::processEvents();
}
Якщо ви уважно дивились відео, то мабуть помітили, що коли процесс не відображається він проходить скоріше ;)
Коментарі
Дописати коментар