2013-01-08 11 views
5

Mam aplikację, która może działać przez dość długi czas skanowania bazy danych.
Podczas tego procesu utrzymuję responsywność mojego programu za pomocą funkcji process-message.
Ta wiadomość procesu jest wyzwalana, gdy mój pasek postępu jest aktualizowany i pobierany.
To działa dobrze, w większości przypadków, ale gdy bazy danych stają się większe, pasek postępu przeskakuje o 1% dłużej, program przestaje odpowiadać do tego czasu.Coś jeszcze, czego mogę użyć, aby zachować responsywność programu poza informacją o procesie?

Czy istnieje inny sposób na utrzymanie mojego programu przy życiu poza wiadomościami procesowymi?

+1

Spróbuj użyć aplikacji Application.HandleMessage. Przechowuj także LastPercentage jako zmienną. Obliczyć NewPercentage i wyjść, jeśli NewPercentage = LastPercentage. –

+0

@CapeCodGunny Nie ma czegoś takiego. Masz na myśli 'Application.HandleMessage'? Dlaczego ta pomoc? –

+0

@David - Dzięki, że zredagowałem mój komentarz. To włamuje się i wymusza tylko jedną aktualizację nie wszystkie oczekujące aktualizacje systemu Windows. –

Odpowiedz

8

Wielowątkowość to odpowiedź. Standardowa aplikacja Delphi to po prostu aplikacja z pojedynczym gwintem, która może wykonywać jedną rzecz na raz. W związku z tym blokada GUI, nie może pozostać responsywna, jeśli robi coś innego.

Jeśli chcesz mieć reagujące gui i jednocześnie wykonywać ciężki lifting, musisz podnieść ciężki przedmiot w oddzielnym wątku lub nitkach. W ten sposób twój główny wątek może zapewnić, że masz program responsywny, a wątki robocze wykonują ciężki lifting. Działa to dobrze w przypadku ciężkiej pracy z bazami danych, ale również w przypadku pobierania plików lub sytuacji, w których odpowiedź na przykład zdalnego serwera może trwać długo.

Ale ta odpowiedź prawdopodobnie dostarczy więcej pytań niż odpowiedzi, ponieważ wyjaśnienie, W JAKI SPOSÓB używać wielowątkowości, byłoby zbyt dużym wyjaśnieniem tego pytania.

Jeszcze jedna rzecz: rzetelnie spójrz na kod bazy danych. W jaki sposób pobierasz rekordy z bazy danych, czy istnieją dobre indeksy w bazie danych itp. Itp. Możesz uzyskać szalone poprawki prędkości, optymalizując ten kod, zanim zaczniesz myśleć o wielowątkowości.

Znalazłem następujący zasób: http://thaddy.co.uk/threads/, który można pobrać ze zdjęciami pod adresem: http://cc.embarcadero.com/item/14809 jako bardzo przydatny samouczek gwintowania.

+5

Standardowa aplikacja Delphi nie jest pojedyncza. Posiadanie wielu wątków nie rozwiązuje problemu. Przenoszenie długich uruchomień z wątku GUI jest tym, co rozwiązuje problem. –

+0

@DavidHeffernan teraz masz mnie zdezorientowany. Zawsze miałem wrażenie, że standardowy program Delphi dla wszystkich celów i celów zachowywał się jak program z pojedynczym wątkiem, chyba że specjalnie uruchomiłeś dodatkowe wątki.Długie działanie z GUI jest dokładnie tym, na co mam zamiar odpowiedzieć. –

+0

Mam na myśli, że powinieneś to wyjaśnić w odpowiedzi. Nie mówisz wprost, że twoją radą jest umieszczenie DB w innym wątku. –

3

Jeśli chcesz, aby twój program GUI wyglądał na responsywny, musisz obsłużyć kolejkę komunikatów w odpowiednim czasie. Nie ma alternatywy.

Jeśli chodzi o uruchamianie zapytań do bazy danych, sposobem na to, bez zamrożenia interfejsu użytkownika, jest przeniesienie zapytania do innego wątku.

+0

Jaka jest strategia aktualizowania interfejsu użytkownika z wątku? Zawsze napotykam ten problem, gdy główny program wychodzi, ale wątek nadal działa. –

+0

@LeonardoHerrera Nie rozumiem, w jaki sposób te dwie kwestie są ze sobą powiązane. Aby zaktualizować interfejs użytkownika z wątku, zwykle najlepszym sposobem jest przekazywanie wiadomości (i niekoniecznie wiadomości systemu Windows). –

Powiązane problemy