ann_nef
|
|
« : 16-03-2011 13:41 » |
|
Пишу в Visual C++ 6 с использованием MFC. Пыталась реализовать: Создано окно, в котором появлется надпись "ЖДИТЕ идёт проверка", выполняется функция проверки. По окончании проверки появляется кнопка ПОВТОР либо кнопка ОК, написаны ф-ции обработки нажатия этих кнопок. Вызов Ф-ции проверки поместила в InitDialog(), тк другого не придумала. Получила в результате не то, что хотела. А именно, окно на экране появляется только по окончании ф-ции проверки. Те, вместо того,чтобы спокойно ждать окончания проверки, любуясь на успокаивающую надпись "ЖДИТЕ", я вижу "пустой" экран. Помогите,чем можИте...
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #1 : 16-03-2011 13:46 » |
|
Тяжёлые вычисления стоит делать в отдельном потоке, чтобы не "замораживать" интерфейс приложения - в противном случае пользователь ведь может решить, что оно зависло. То же самое рекомендует и сама Microsoft: где-то у них в MSDN были гайдлайны по пользовательскому интерфейсу, где крайне не рекомендовалось "замораживать" контролы и заниматься синхронной обработкой прямо в UI-потоке; и рекомендовалось давать пользователю максимум свободы, вплоть до отмены текущих операций, чтобы он не пугался. Что, впрочем, не мешает самой Microsoft первой же свои рекомендации и нарушать.
Если не смущает "зависание" интерфейса, сопровождающееся надписью в заголовке "программа не отвечает" на время обработки, то её стоит поместить куда-нибудь после InitDialog - в doModal в случае модального (хотя в этом варианте не уверен) или ещё куда-то (например, создать новое пользовательское событие и отправлять его после инициализации самому себе, или реагировать на какое-нибудь стандартное событие).
|
|
« Последнее редактирование: 16-03-2011 13:50 от Вад »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #2 : 17-03-2011 08:20 » |
|
Если не усложнять и если не требуется кнопка отмены, то в InitDialog() вполне сойдёт BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); //показываем диалог ShowWindow(SW_SHOW);
//тяжёлые вычисления Sleep(5000);
//закрываем диалог CDialog::OnCancel(); //или CDialog::OnOK(); //или EndDialog(IDOK); //или EndDialog(IDCANCEL);
return TRUE; }
(не тестировал, могут быть очепятки)
|
|
« Последнее редактирование: 17-03-2011 08:21 от Алексей1153++ »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #3 : 17-03-2011 08:38 » |
|
Я бы начал с немодального диалога. Показать перед началом вычислений и погасить после.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 17-03-2011 08:49 » |
|
Да с модальным возни меньше А красиво переделать потом можно, когда время будет
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #5 : 17-03-2011 08:51 » |
|
Алексей1153++, тут, если разобраться, делов на 2 минуты: сделать CThread, скормить ему вычисления и послать оттуда сообщение об окончании.
Впрочем, если программа не предназначена для пользователей в принципе, то всё равно, как делать.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #6 : 17-03-2011 08:54 » |
|
Вад, с модалкой таких сложностей совершать не нужно: визардом делаешь диалог, класс к нему. Удаляешь кнопки, пишешь в OnInitDialog(). И всё - Вызов DoModal() и PROFIT
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #7 : 17-03-2011 08:58 » |
|
Да я что, я ничего. Можно ведь и совсем в консольке выполнять - там даже диалог создавать не нужно Мы ничего не знаем о том, как будет использоваться приложение. Я - за то, чтобы человечно отнестись к пользователю, поэтому с самого начала и уточняю в этой теме, что продвинутые методы борьбы - только для совершенно постороннего пользователя, а не для себя и программиста-соседа по офису. И уже наличие надписи "ЖДИТЕ" как бы намекает, что пользователь, скорее, всё-таки посторонний, и ему чудеса замерзающих на минуту-другую-полчаса приложений могут показаться злыми: ещё побежит к админу жаловаться "у меня программа виснет, чоделать!"
|
|
« Последнее редактирование: 17-03-2011 09:00 от Вад »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #8 : 17-03-2011 09:03 » |
|
Самое простое: modeless dialog и песочные часы. Самое идеальное - тред, как Вад говорит. Лёшик, вот любишь ты поизвращаться.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 17-03-2011 09:09 » |
|
Неа, я люблю как удобнее мне
|
|
|
Записан
|
|
|
|
ann_nef
|
|
« Ответ #10 : 17-03-2011 10:06 » |
|
Спасибо вам всем. Попробую все варианты. Пока пошла по другому пути, чтобы не вносить больших изменений в написанную мною программу. Сейчас делаю более понятным интерфейс для пользователей(ОТК, метрология, так что совсем посторонние) после предварительной сдачи ПО.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #11 : 17-03-2011 10:18 » |
|
Неа, я люблю как удобнее мне А нужно, чтобы пользователю было удобно.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #12 : 17-03-2011 10:48 » |
|
Пользователю удобно будет ) Всё равно отмены нет - сиди и фтыкай в "ЖДИТЕ"
|
|
|
Записан
|
|
|
|
|