polymorphism napisał(a):Daj tak: std::min<DWORD>(aVail, 1023)
To nic nie daje i nie wiem czemu. Użyłem standardowej funkcji Buildera
"Min", która robi dokładnie to samo, czyli zwraca mniejszą wartość. W niczym to nie zmienia działania.
Tak naprawdę to, to od czego zacząłem ten wątek, zostało rozwiązane jednym "Application->ProcessMessages();"
Ale korzystając z porad mądrzejszych, postanowiłem się czegoś nauczyć i zacząłem dalej grzebać przy kodzie ...
Całe założenie mojej aplikacji/nakładki, to multipleksowanie plików wideo i subtitles. Robi to aplikacja "mkvmerge.exe" i jest na nią doskonałe GUI, czyli MKVToolNix.
Problemem dla mnie było, że w przypadku seriali, czyli np. 25 odcinków, musiałem 25 razy ładować pliki, zmieniać ustawienia .... i multipleksować.
Nie będę się rozpisywał dlaczego tak robię, ale miałem potrzebę napisania innej nakładki.
Po kilku próbach według twoich rad, zoptymalizowałem kod do dwóch wersji (nie będę wklejał całego kodu, tylko tę nową część):
while(PeekNamedPipe(read_stdout,buf,1023,&bRead,&aVail,NULL))
{
GetExitCodeProcess(pi.hProcess,&exit);
if(exit != STILL_ACTIVE)
break;
ReadFile(read_stdout,buf,1023,&bRead,NULL); //read the stdout pipe
mess = String((char*)buf);
pos = mess.Pos("\n");
while(pos > 0)
{
Ekran->Lines->Add(mess.SubString(1, pos-1));
mess = mess.Delete(1, pos);
pos = mess.Pos("\n");
}
if(!mess.IsEmpty())
{
Ekran->Lines->Add(mess);
}
bzero(buf);
Application->ProcessMessages();
}
Ta część gra i buczy, pokazuje cały przebieg operacji, procent wykonania i wszystko co tylko mkvmerge.exe wysyła. Ale ....
jest też druga wersja, która pokazuje tylko i wyłącznie informację o aplikacji "mkvmerge v18.0.0 ('Apricity') 64-bit", również tworzy nowe zmultiplikowane pliki ....
tylko jakieś 40 razy szybciej
do
{
PeekNamedPipe(read_stdout,buf,1023,&bRead,&aVail,NULL)
GetExitCodeProcess(pi.hProcess,&exit);
ReadFile(read_stdout,buf,1023,&bRead,NULL);
mess = String((char*)buf);
pos = mess.Pos("\n");
while(pos > 0)
{
Ekran->Lines->Add(mess.SubString(1, pos-1));
mess = mess.Delete(1, pos);
pos = mess.Pos("\n");
}
if(!mess.IsEmpty())
{
Ekran->Lines->Add(mess);
}
bzero(buf);
Application->ProcessMessages();
} while(exit != STILL_ACTIVE)
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(write_stdout);
CloseHandle(read_stdout);
Rezultat pierwszej wersji :mkvmerge v18.0.0 ('Apricity') 64-bit
'Q:\Video\Hawaii Five-0 Season 6\hawaii.five-0.2010.601.hdtv-lol.mp4': Using the demultiplexer for the format 'QuickTime/MP4'.
'Q:\Video\Hawaii Five-0 Season 6\hawaii.five-0.2010.601.hdtv-lol.srt': Using the demultiplexer for the format 'SRT subtitles'.
Q:\Video\Hawaii Five-0 Season 6\hawaii.five-0.2010.601.hdtv-lol.mp4' track 0: Using the output module for the format 'AVC/h.264'.
'Q:\Video\Hawaii Five-0 Season 6\hawaii.five-0.2010.601.hdtv-lol.mp4' track 1: Using the output module for the format 'AAC'.
'Q:\Video\Hawaii Five-0 Season 6\hawaii.five-0.2010.601.hdtv-lol.srt' track 0: Using the output module for the format 'text subtitles'.
The file 'Q:\Video\Hawaii Five-0 Season 6\Hawaii 5-0 S06E01.mkv' has been opened for writing.
Progress: 0%
Progress: 4%
...
Progress: 100%
The cue entries (the index) are being written...
Multiplexing took 16 seconds.
mkvmerge v18.0.0 ('Apricity') 64-bit
...
...
Multiplexing took 15 seconds.
mkvmerge v18.0.0 ('Apricity') 64-bit
...
...
Multiplexing took 18 seconds.
mkvmerge v18.0.0 ('Apricity') 64-bit
...
...
Multiplexing took 23 seconds.
mkvmerge v18.0.0 ('Apricity') 64-bit
...
...
Multiplexing took 23 seconds.
mkvmerge v18.0.0 ('Apricity') 64-bit
...
...
Multiplexing took 19 seconds.
mkvmerge v18.0.0 ('Apricity') 64-bit
...
...
Multiplexing took 25 seconds.
Proces zakończony powodzeniem !
jak łatwo podliczyć, dla 7 plików - 139 sekund
Druga wersja:mkvmerge v18.0.0 ('Apricity') 64-bit
mkvmerge v18.0.0 ('Apricity') 64-bit
mkvmerge v18.0.0 ('Apricity') 64-bit
mkvmerge v18.0.0 ('Apricity') 64-bit
mkvmerge v18.0.0 ('Apricity') 64-bit
mkvmerge v18.0.0 ('Apricity') 64-bit
mkvmerge v18.0.0 ('Apricity') 64-bit
Proces zakończony powodzeniem !
Czas to około 8 sekund.