Witam
Napisałem programik, który ma kilka petli. Wykonywane są tam różne porównania i operacje dodawania. Wykonanie tych operacji zajmuje kilka lub wiecej minut dlatego jest tam wskaźnik postępu. I teraz mam taki problem: jeżeli skompiluje program w BCB6 wszystko działa dobrze pętle się wykonują a ProgressBar pokazuje postępy obliczeń. Jednak jeżeli "odpalę" już ten program poza BCB6 zaczynają się problemy: pętla się wykonuje ale pasek postępu tak w połowie lub wcześniej przestaje dawać znaki "życia". Nie mówiac już o tym że np. umieszczony w tej aplikacji zegarek również przestaje działać aż do skończenia wykonywania się operacji. Próbowałem odświeżania ale daje nie ciekawe efekty. Zbyt czeste odświeżanie powoduje mruganie, a rzadsze nie zawsze się wykona. Może ktoś ma jakiś pomysł rozwiązania tego problemu. Trochę pomaga zwiększenie priorytetu ale tu pojawia się moje drugie pytanie: jak zmienić priorytet z poziomu programu?
Pozdrawiam.
Mam identyczny problem. Program przetwarza 600MB plik danych. Pasek postepu zatrzymuje sie na 1% i do zakonczenia pracy nic sie nie zmienia. Wiec tez jestem zainteresowany rozwiazaniem tego problemu.
A w jakim watku wykonujecie obliczenia? W glownym?!!!
Jesli w glownym, to zle - tak sie nie robi. Program sie zachowuje prawidlowo :). Na dlugie obliczenia zapuszcza sie osobny watek, zeby aplikacja mogla normalnie przetwarzac komunikaty Windows. Jesli zablokujesz glowny watek dluga petla, to komunikaty nie beda sie przetwarzac w ogole lub beda przetw. zbyt wolno (zalezy czy w petli umiescisz gdzies odpowiednie odwolania do systemu - np. jak dasz refresha, to czasem niektore komunikaty przetworzy i dlatego na poczatku progress bar bedzie dzialal dobrze).
aaaaaaaaaaaaaaaa........ no chyba ze tak.........niby logiczne...... :]
Ale jeśli już zostaje się w wątku głównym - użyliście aby Application->ProcessMessages?
Umieszczone tego w czasochłonnej pętli na ogół pomaga, bo umożliwia przetwarzenie komunikatów.
Umieszczone tego w czasochłonnej pętli na ogół pomaga, bo umożliwia przetwarzenie komunikatów.
Ale spowalnia petle. :-P
Fakt, spowalnia, ale doświadczenie podpowiada mi, że spadek wydajności nie jest tutaj rażący.
Jeśli więc nie zależy nam na każdej sekundzie, możemy zaryzykować.
Duzego spadku wydajnosci nie bedzie, poniewaz App->PM(), sprawdzi ilosc komunikatow w kolejce i po kolei je przetwarza. Komunikatow tych bedzie bardzo malo (jesli beda jakiekolwiek) np WM_MOUSEMOVE. Jesli zalezy wam jednak bardzo na szybkosci to nie wywolujcie PM przy kazdej iteracji, tylko co jakis czas, np co 1sek.
Mam jeszcze pytanko: jak z poziomu programu zmienić jego priorytet w Win XP?
Mozesz sprobowac SetPriorityClass(). Podajesz w parametrach uchwyt do procesu i priorytet procesu. Pod xp powinno dzialac. Wiecej na <url>msdn.microsoft.com</url>