CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Wyświetlanie postępu wczytywania pliku

Wyświetlanie postępu wczytywania pliku

dział ogólny

Wyświetlanie postępu wczytywania pliku

Nowy postprzez Koziol » niedziela, 24 października 2010, 17:57

Stworzyłem dwie funkcje które w StatusBar mają wyświetlać postęp wczytywania pliku (plik około 200tys linijek, a może być dużo większy)
KOD cpp:     UKRYJ  
void __fastcall TForm1::setBar(int maxpos)
{
        this->MaxData=maxpos;
        this->StatusBar1->Panels->Items[0]->Text="Loading... (0-"+IntToStr(this->MaxData)+")";

}
void __fastcall TForm1::increaseBar(int i)
{
        int p;
        this->StatusBar1->Panels->Items[0]->Text="Loading... ("+IntToStr(i)+"-"+IntToStr(this->MaxData)+")";
        p=100*(((float)i)/((float)this->MaxData));
        if(!(p%5))this->StatusBar1->Panels->Items[1]->Text=IntToStr(p);
}


odwołuje się do nich poprzez:
KOD cpp:     UKRYJ  
bool __fastcall TFilesData::LoadData()
{
        if(!this->OpenFile()) return false;


        this->_File->Seek(0,soFromEnd);
        int maxpos=this->_File->Position;
        Form1->setBar(maxpos);
        this->_File->Seek(0,soFromBeginning);
        char buffer[256];
        while(this->_File->Position!=maxpos)
                {
                this->_File->Read(buffer,256);
                Form1->increaseBar(this->_File->Position);
                }
       return true;
}
 

(wiem że na przeczytanych danych w chwili obecnej nic nie robię ;) )

Problemem jest to, że w momencie odczytu program "zawiesza się", a po chwili (~3-4sec) wyskakuje informacja, że przeczytał cały plik. Niema informacji pośredniej tj wskaźnika w procentach ani numeru odczytywanej lini/położenia wskaźnika. Jak temu zaradzić?

PS. TFileStream->Read(void* buffer,int n) czyta to dane do n-tego baju i/lub napotkania znaczka \n tak?
Avatar użytkownika
Koziol
Intelektryk
Intelektryk
 
Posty: 144
Dołączył(a): niedziela, 13 lipca 2008, 17:36
Podziękował : 8
Otrzymał podziękowań: 2
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder
    Windows XPFirefox

Re: Wyświetlanie postępu wczytywania pliku

Nowy postprzez polymorphism » niedziela, 24 października 2010, 20:03

Problemem jest to, że w momencie odczytu program "zawiesza się", a po chwili (~3-4sec) wyskakuje informacja, że przeczytał cały plik.

Było milion razy. Użyj Metody ProcessMessages obiektu Application lub użyj oddzielnego wątka. Opcja numer dwa jest lepsza, choć (nieco) trudniejsza w implementacji.

PS. TFileStream->Read(void* buffer,int n) czyta to dane do n-tego baju i/lub napotkania znaczka \n tak?

TFileStream jest strumieniem binarnym, więc znak końca linii nie robi mu różnicy, przeczyta tyle bajtów, ile zażądasz (o ile może). Użyj strumienia ifstream lub jakiegoś odpowiednika VCL-owskiego, jeśli chcesz czytać liniami.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości