Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
8 / 8 / 3
Регистрация: 17.05.2012
Сообщений: 50

Перемещение формы во время выполнения цикла

29.06.2012, 19:52. Показов 2831. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возникла проблема следующего характера. Во время выполнения какого нибудь долгого цикла, программа, своего рода, зависает, и попытки переместить форму, или даже попросту по ней кликнуть приводят к тому, что Windows (семерка) предлагает закрыть зависшее приложение. И это нормально. Разумеется, в цикле стоит команда изменения положения ProgressBar-а, чтобы пользователь видел, сколько ему осталось ждать, однако хотелось бы сделать так, чтобы программа вела себя нормально при действиях с формой. Как это можно сделать? Может есть какой нибудь метод обновления формы, вызов которого можно поставить при завершении каждой итерации цикла?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.06.2012, 19:52
Ответы с готовыми решениями:

Перемещение формы во время выполнения функции
При загрузке окна происходит выполнение функции - иногда быстро, но часто долго выполняется. Результаты выгружаются в grid. Так при...

Выполнения цикла на заданное время
как сделать чтобы цикл while выполнялся определенное время?например,чтобы он выполнялся 3 секунды

Окно программы во время выполнения цикла
Пока выполняется цикл в программе окно становится не доступным. Ни свернуть не переместить и тд. Как с этим бороться? Цикл запускается...

15
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
29.06.2012, 19:58
Application->ProcessMessage
Это?
1
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
29.06.2012, 20:07
Цитата Сообщение от programm1r Посмотреть сообщение
Application->ProcessMessage
Application->ProcessMessages();
1
8 / 8 / 3
Регистрация: 17.05.2012
Сообщений: 50
29.06.2012, 20:13  [ТС]
Спасибо, оно) Вышеперечисленные проблемы решены. Однако приложение не реагирует на закрытие (через крестик), и в свернутом виде при предпросмотре через AeroPeek не обновляется. Можно ли это тоже как нибудь реализовать?
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
29.06.2012, 20:19
Может этот долгий цикл реализовать в отдельном потоке?
0
8 / 8 / 3
Регистрация: 17.05.2012
Сообщений: 50
29.06.2012, 20:34  [ТС]
Ну просто я пока не умею работать с потоками в билдере) Но и этот способ тоже работает, но к сожалению напрягает тот факт, что невозможно закрыть программу.
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
29.06.2012, 20:41
В оконном приложении главный поток (первичный) желательно оставлять исключительно для обработки событий от оконных компонентов. Рано или поздно вы прийдете к этому. А потоки в билдере создавать довольно просто, тем более вам нужен лишь один.

По идее программа должна реагировать на закрытие, т.к. ProcessMessages() как и позволяет программе обработать сообщения в очереди... Может одна итерация занимает много времени, тогда попробовать почаще вызывать ProcessMessages().

Лучше бы код показали, чем гадать в чем там проблемы.
0
8 / 8 / 3
Регистрация: 17.05.2012
Сообщений: 50
29.06.2012, 20:57  [ТС]
Ну свой код показывать нет смысла, потому что цикл весьма громоздкий. Вот пример попроще:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
    ProgressBar1->Max = 10000;
 
    for(int i=0; i<=10000; i++)
    {
        Memo1->Lines->Add(i);
        ProgressBar1->StepIt();
        Application->ProcessMessages();
    }
}
Здесь, пока цикл выполняется, программа тоже не реагирует на закрытие.
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
29.06.2012, 21:02
Так вот если цикл громоздкий попробуйте почаще добавить более одного ProcessMessages(). А в этом коде проблема совсем другая... так в Memo добавлять не очень культурно
0
8 / 8 / 3
Регистрация: 17.05.2012
Сообщений: 50
29.06.2012, 21:10  [ТС]
Не помогает добавлять почаще ProcessMessages(). Все равно сообщение о закрытии обрабатывается только после завершения цикла. Но ведь вряд ли здесь не получается обработать сообщение закрытия из-за того, что я добавляю строчку в Memo? Например если я сделаю вот такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
    ProgressBar1->Max = 1000000;
 
    for(int i=0; i<=1000000; i++)
    {
        //Memo1->Lines->Add(i);
        ProgressBar1->StepIt();
        Application->ProcessMessages();
    }
}
то проблема не исчезнет.
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
29.06.2012, 21:31
Да действительно. Могу только предложить завести переменную stop = false и проверять ее в цикле, а в Form1::Close() устанавливать ее в true. Вроде бы срабатывает.
1
8 / 8 / 3
Регистрация: 17.05.2012
Сообщений: 50
29.06.2012, 21:41  [ТС]
Спасибо, с введенной переменной работает. Значит метод OnClose все таки вызывается но почему то закрытие приложения игнорируется... Так может быть можно закрыть приложение прямо из этого метода другими средствами?
0
 Аватар для programm1r
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
29.06.2012, 21:46
Думаю не желательно... Это как то связанно с оконными компонентами, к сожалению не в курсе как. Но если закомментировать внутри цикла обращение к оконным компонентам, то все срабатывает. Не было необходимости, так что подробней пояснить не могу.
1
8 / 8 / 3
Регистрация: 17.05.2012
Сообщений: 50
29.06.2012, 21:49  [ТС]
Понятно) Большое спасибо за помощь) В будущем сделаю все это через потоки) А пока реализую так.

UPD помог вызов exit() прямо из метода OnClose
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
29.06.2012, 23:02
Что удивительно, такого метода в билдере нет.
0
8 / 8 / 3
Регистрация: 17.05.2012
Сообщений: 50
29.06.2012, 23:55  [ТС]
Да, прошу прощения, не метода а события, оговорился
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.06.2012, 23:55
Помогаю со студенческими работами здесь

Как закрыть программу во время выполнения цикла while
У меня возникла такая проблема, когда я пытаюсь закрыть программу во время выполнения while у меня она тупо не закрывается, хотелось-бы...

Как задать время выполнения цикла в секундах?
Здравствуйте. кусок кода для вывода строки текста на экран const char string1 = &quot;sample of text&quot;; HDC dc =...

Не могу достать данные из потока во время выполнения цикла
Доброго времени суток. Проблема вот в чём: есть код формы private void button1_Click(object sender, EventArgs e) { ...

Нет ответа на команды во время выполнения бесконечного цикла
Здравствуйте. Такая проблема. Есть код мини игры, если её можно так назвать, в которой после &quot;покупки&quot; некой вещи к значению...

SIMATIC S7-400. Почему увеличивается время выполнения программного цикла?
Как узнать, почему увеличивается время выполнения программного цикла?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru