Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Порядок выполнения функций...


Автор: BlowFish 23.11.2002, 17:35
Пишу в VC. Имеется два элемента на форме (диалоговое окно): кнопка и edit. Обрабатываю событие - нажатие кнопки. В обработчике выполняю следующие действия:
- кнопка становится неактивной
- в edit`е выводится текст (например: "Analyzing...")
- дальше идут мои собственные вычисления
- возвращаю в исходное состояние: кнопка - активна, в edit`e выводится "Ready"
- return;

Когда выполняется прога, при нажатии на кнопку она меняет свое состояние активна-неактивна, а вот в edit как была надпись "Ready" так и осталась.

Посоветуйте пожалуйста, как сделать, чтоб в момент вычисления в edit отражалось текущее состояние программы.

Автор: Klin 23.11.2002, 17:56
Цитата(BlowFish @ 23.11.2002, 09:35)
...Посоветуйте пожалуйста, как сделать, чтоб в момент вычисления в edit отражалось текущее состояние программы.

То есть?

Автор: BlowFish 23.11.2002, 18:04
т.е. хочу чтоб, когда я нажал на кнопку (при этом у меня прога считает числа) в edit`е отобразилась надпись "Analysing...". А этого не происходит  :(

Автор: Baa 23.11.2002, 19:14
А может это происходит? просто вычисления слишком быстро проходят, что тут же реади выводится?

Автор: BlowFish 24.11.2002, 00:46
Нет вычисления долгие (~15сек). Просто если в конце обработчика не возвращать в исходное состояние edit, то после выполнения обработчика в edit будет "Analyzing...", т.е. хотя функция на смену надписи "Ready" в "Analyzing..." вызывается раньше, чем происходят вычисления, но обновлятся состояние edit`а будет после обработчика нажатия кнопки.
Причем Invalidate() не помагает

Автор: Baa 24.11.2002, 01:25
Код бы чтоли показал... (токо вычисления убери куда-нить)

Автор: BlowFish 24.11.2002, 02:55
Код
void CTestDlg::OnButtonStart()
{
ButtonStart.EnableWindow(false); // кнопка неактивна
StatusLineEdit.SetWindowText("Analyzing..."); //собственно статус-лайн, вывожу надпись "Analyzing..."
Analiz(); //вычисления, длятся ~10-15 сек
StatusLineEdit.SetWindowText("Ready"); //после окончания вычислений опять состояние "Ready"
ButtonStart.EnableWindow(true); //кнопка активна
}


В результате выполнения проги (нажатие на кнопку) надпись в StatusLineEdit как была "Ready", так и осталась "Ready".
Если запустить такой код:
Код
void CTestDlg::OnButtonStart()
{
ButtonStart.EnableWindow(false); // кнопка неактивна
StatusLineEdit.SetWindowText("Analyzing..."); //собственно статус-лайн, вывожу надпись "Analyzing..."
Analiz(); //вычисления, длятся ~10-15 сек
/////////////StatusLineEdit.SetWindowText("Ready"); //после окончания вычислений опять состояние "Ready"
ButtonStart.EnableWindow(true); //кнопка активна
}

то после вычислений (после выполнения OnButtonStart()) в StatusLineEdit появится "Analyzing...", т.е. все выводится только не в том порядке как мне надо.
Мне так-то надо всего лишь элемент в программе, который бы отображал состояние выполнения программы.

Автор: Baa 24.11.2002, 08:50
Как я понял, UpdateWindow не катит :\ засунь вычисления в отдельный поток  ;)

Автор: Baa 24.11.2002, 09:04
Вобщем-то вот... все отлично работает...
Код

       CEdit* Edit = (CEdit*) GetDlgItem (IDC_EDIT1);
CButton* Button = (CButton*)GetDlgItem (IDC_BUTTON1);
Edit->SetWindowText ("Ready");
Edit->UpdateWindow ();
Sleep (2000);
Button->EnableWindow (FALSE);
Edit->SetWindowText ("Analyzing");
Edit->UpdateWindow ();
Sleep (5000);
Edit->SetWindowText ("Ready");
Button->EnableWindow (TRUE);

Автор: BlowFish 24.11.2002, 17:21
Спсибо все получилось  :)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)