PDA

Показать полную графическую версию : C++ Builder->Определение времени, необходимого для завершения процесса


XCodeR
13-12-2004, 10:13
Сорри за тупое название темы, в двух словах траблу не описать.
Есть форма, на которой происходит какой нить длительный процесс(в данном случае подгрузка а нимации и БД), необходимо отобразить TPRogressBar и показываьт на нем ход выполнения работы.. Собственно, как?!
Как я понимаю надо юзать нити(потоки, Thread'ы), токо вот как конкретно?..
желательно с примерами...
P.S. В Гугл и Поиск не посылать.....

Netscaper
13-12-2004, 16:18
Вовсе не обязательно. При выполнении какого-нибудь цикла можно сделать так:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
for(int i=0;i<100000;i++)
{
ProgressBar1->Position = i;
Application->ProcessMessages();
}
}

Т.е. давать возможность приложению обработать очередь сообщений.
Если TThread, то достаточно создать наследный класс, скажем, TMyThread, в котором перекрыт абстрактный метод Execute, а также введен новый ShowMeth, который меняет значение ProgressBar.
Где-нибудь в Execute необходимо вызвать метод Synchronize:

Synchronize(ShowMeth);

Который обеспечит критическое выполение метода ShowMeth (критическая секция).

XCodeR
14-12-2004, 17:35
Грейт сенькс.... ;)

Netscaper
14-12-2004, 17:52
Море грейт плежерс :gigi:

XCodeR
27-12-2004, 12:21
Есть очень длительный процесс(загрузка анимации и БД, к примеру). Нужно в TProgressBar показать прогресс выполнения этого процесса? Из этого следует вопрос - как можно орпеделить время необходимое на завершение процесса?

pva
18-01-2005, 14:32
Допустим, известна некоторая мера, показывающая сколько нужно сделать, например, кол-во файлов, байт, строк матрицы и т.д., алгоритм устроен циклом for(i=0; i<imax; i++), то можно сделать вставку типа

// thread2:
class MyThread : SomeThreadClass {
...
public:
static int op_to_do;
static int op_done;
};

MyThread::execute(...)
{
...
for(op_done=0; op_done<op_to_do; op_done++) {
...
}
}


// thread1:
void SomeGuiClass::onTimer()
{
progressBar->setValue(op_done);
}


Допустим неизвестно даже примерно, сколько чего нужно сделать. Тогда действует обманка. Нужно показывать состояние по ассимптотически ограниченному закону, например:

void SomeGuiClass::onTimer()
{
// да простят меня пользователи
progressBar->setValue(100 - 1./(1 + time_elapsed));
}

pva
18-01-2005, 14:40
Если известно сколько нужно сделать и сколько прошло времени, всё решается в пропорциях:

timeLeft = double(timeElapsed)*(work_to_do - work_done)/work_done




© OSzone.net 2001-2012