| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Как сделать, чтобы компоненты были активными? |
| Автор: SerK 7.12.2016, 21:39 |
| Проблема такая: При нажатии на Кнопку (выполняется фукнция обработки строк), все компоненты перестают реагировать пока функция не выполнится. А мне нужно выводить данные в Прогресс бар - как функция выполняется: какая строка обрабатывается, какая позиция искомого слова, время выполнения. Словом отображать весь ход работы функции. Как это реализовать? |
| Автор: vol4ek 8.12.2016, 05:53 |
| По нажатию кнопки создавайте отдельный поток и в нем ыыполняйте всю обработку строк. |
| Автор: feodorv 8.12.2016, 10:58 | ||
Можно и в одном потоке, главное - периодически очищать очередь сообщений. Например, после обновления данных в прогресс баре (через различные SendMessage) можно вызвать такую функцию:
Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя). Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-sdelat-chtoby-komponenty-byli-aktivnymi-id584857f927bb7e167838cce3#findElement_E7045_584912a720a8ef0e663b3f11_0 |
| Автор: feodorv 8.12.2016, 10:58 | ||
Можно и в одном потоке, главное - периодически очищать очередь сообщений. Например, после обновления данных в прогресс баре (через различные SendMessage) можно вызвать такую функцию:
Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя). Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-sdelat-chtoby-komponenty-byli-aktivnymi-id584857f927bb7e167838cce3#findElement_E7045_584912a720a8ef0e663b3f11_0 |
| Автор: feodorv 8.12.2016, 10:58 | ||
Можно и в одном потоке, главное - периодически очищать очередь сообщений. Например, после обновления данных в прогресс баре (через различные SendMessage) можно вызвать такую функцию:
Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя). Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-sdelat-chtoby-komponenty-byli-aktivnymi-id584857f927bb7e167838cce3#findElement_E7045_584912a720a8ef0e663b3f11_0 |
| Автор: feodorv 8.12.2016, 10:58 | ||
Можно и в одном потоке, главное - периодически очищать очередь сообщений. Например, после обновления данных в прогресс баре (через различные SendMessage) можно вызвать такую функцию:
Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя). Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-sdelat-chtoby-komponenty-byli-aktivnymi-id584857f927bb7e167838cce3#findElement_E7045_584912a720a8ef0e663b3f11_0 |
| Автор: feodorv 8.12.2016, 10:58 | ||
Можно и в одном потоке, главное - периодически очищать очередь сообщений. Например, после обновления данных в прогресс баре (через различные SendMessage) можно вызвать такую функцию:
Если нужна своевременная реакция на кнопку отмены, то данную функцию нужно периодически вызывать также во время длительных операций обработки данных. Тогда пользовательский интерфейс будет живым (реактивным на действия пользователя). Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Kak-sdelat-chtoby-komponenty-byli-aktivnymi-id584857f927bb7e167838cce3#findElement_E7045_584912a720a8ef0e663b3f11_0 |
| Автор: xvr 8.12.2016, 13:44 | ||
В Builder'е есть специальный метод для такой обработки - Application->ProcessMessages();
В поток надо было вынести выполнение этой самой функции, а вы что туда поместили? |
| Автор: SerK 8.12.2016, 21:49 | ||||||||
Поместил в файл потока:
а вызов в файле главной формы:
Добавлено через 4 минуты и 19 секунд
Как им пользоваться в данном случае? |
| Автор: xvr 9.12.2016, 19:12 |
А где собственно вычисления? Если внутри MyT::Process, то это неправильно. Реальные вычисления должны вызываться вне метода Synchronize Периодически вызывать в процессе длительных вычислений. Интервал между вызовами напрямую влияет на 'отзывчивость' интерфейса |
| Автор: SerK 10.12.2016, 09:55 | ||||
Вычисления вызываются вне метода Synchronize
Спасибо - разобрался с Application->ProcessMessages(); |