Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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 будет учить пользоваться поиском smile  smile 
А вообще то есть класс 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, для изменения прогрессбара.
 

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