Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   C++ Builder->Определение времени, необходимого для завершения процесса (http://forum.oszone.net/showthread.php?t=43075)

XCodeR 13-12-2004 10:13 279752

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

Netscaper 13-12-2004 16:18 279831

Вовсе не обязательно. При выполнении какого-нибудь цикла можно сделать так:
Код:

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 280146

Грейт сенькс.... ;)

Netscaper 14-12-2004 17:52 280149

Море грейт плежерс :gigi:

XCodeR 27-12-2004 12:21 283844

C++ Builder->Определение фремени необходимого для завершения процесса
 
Есть очень длительный процесс(загрузка анимации и БД, к примеру). Нужно в TProgressBar показать прогресс выполнения этого процесса? Из этого следует вопрос - как можно орпеделить время необходимое на завершение процесса?

pva 18-01-2005 14:32 289697

Допустим, известна некоторая мера, показывающая сколько нужно сделать, например, кол-во файлов, байт, строк матрицы и т.д., алгоритм устроен циклом 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 289700

Если известно сколько нужно сделать и сколько прошло времени, всё решается в пропорциях:

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


Время: 15:20.

Время: 15:20.
© OSzone.net 2001-