| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Работа программы при длительном процессе |
| Автор: sonyamf 4.5.2006, 17:03 |
| Такая проблема. Моей программе иногда требуется некоторое время для выполнения задачи, в этом нет ничего необычного. От нескольких секунд до нескольких минут, а то и часов. (Что-то типа поиска). Так вот когда начинается эта длительная операция, окно программы перестает отвечать на любые действия, например свернуть-развернуть, подвинуть.. и курсор превращается в песочные часы.Это может и правильно, но хотелось что бы с окном можно было что-то делать, например сворачивать, если она долго работает.На форме расположен ProgressBar, он работает нормально.т.е. процесс выполняется. Но форма отвечает только после завершения заданной операции (поиска). Думаю, что суть моей проблемы ясна.. |
| Автор: _hunter 4.5.2006, 17:11 |
| добавь Application->ProcessMessages(); в цикле той длительной операции а лучьше в поток ее засунь (операцию) |
| Автор: sonyamf 4.5.2006, 17:52 | ||
с первым понятно, а вот :
можно немного подробнее, как это сделать? |
| Автор: _hunter 4.5.2006, 17:59 |
| File->New->Thread Object вызов длительной операции засовываеш в Execute потом создаеш новый экземпляр этого объекта и все... а вообще -- поиск по слову TThgread |
| Автор: likehood 4.5.2006, 17:59 |
| Щас _hunter будет учить пользоваться поиском А вообще то есть класс TThread, в нем метод Execute(), который и есть тело твоего потока, который будет выполняться паралельно с основным потоком. |
| Автор: sonyamf 4.5.2006, 18:22 |
| А пороще вариантов нет? Просто у меня эта "длительная операция" это не одна функция.Она начинается по щелчку на кнопке. Т.е все описано в событие OnClick. Я не пойму что именно надо вставить в Execute() ? И если вставить то, что у меня в OnClick, то из OnClick убрать? |
| Автор: _hunter 4.5.2006, 18:28 |
| все, что в OnClick перенести в Execute в OnClick засунуть создание потока. все. |
| Автор: sonyamf 4.5.2006, 18:30 |
| Ну ладно, спасибо, буду пробовать... |
| Автор: Artemon 4.5.2006, 18:32 |
| На самом-то деле ситуация довольно затруднительная........ Т.к. программа (я так понял) не была спроектирваная для работы с потоком. Совет: 1) Во-первых: перепиши все операторы твоего OnClick в отдельную ф-ию. 2) Т.к. Ты используешь ProgressBar - передавай на него указатель в конструктоп потокаю 3) Используй ф-ию Synhronize класса THread, для изменения прогрессбара. |