Dostęp do interfejsu w trakcie wykonywania programu

0

Witam, jako element pracy magisterskiej pisze program do analizy sekwencji nukleotydowych genów, pobranych z bazy danych za pomocą idHTTP.

program działa mniej więcej tak:

  1. odczytuje listę genów które maja być przeanalizowane
  2. sprawdza czy informacje o genie xxx zostały juz w przeszłości pobrane jeśli tak to przechodzi do pkt4
  3. wywołuje funkcje ktora pobiera dane:
procedure TForm1.SciagnijDane(NazwaGenu: String);
var
  HTML, Plik : String;
  GenDane: TextFile;
begin
  Plik := 'genes\'+NazwaGenu+'.gene';
  if not FileExists(Plik) then
  begin
    AssignFile(GenDane, Plik);
    HTTP.Connect; 
    try
      try           
        HTML := HTTP.Get('http://srs.ebi.ac.uk/cgi-bin/wgetz?-noSession+-e+[refseq-id:'+NazwaGenu+']+-ascii'); 
        Rewrite(GenDane);
        Write(GenDane,HTML);
        CloseFile(GenDane);
       except
        raise Exception.Create('Nie można połączyć się z serwerem! Sprawdz polaczenie internetowe.');
      end;
    finally
      HTTP.Disconnect;  
    end;
  end
end;
  1. dokonuje analizy statystycznej danych nt genu wydobytych z pliku xxx.gene
  2. wynik analizy zapisuje do TStringGrid
  3. wraca do pkt 2

w trakcie analizy wyświetlane sa informacje o jej stanie: log w TMemo + ProgressBar, poza tym po każdej analizie aktualizowane sa wykresy w TChartFX . Wszystko poza ProgressBarem położone jest na TabbedNotebook.

Program działa poprawnie jednak po kilku iteracjach interfejs przestaje odpowiadać, program działa dalej jednak niemożliwy jest podgląd informacji o analizie do czasu jej zakończenia. O korzystaniu z TabbedNotebook mogę zapomnieć z chwila uruchomienia skryptu jednak z czasem nawet ProgressBar przestaje być aktualizowany.
Program działa wolno ze względu na duża ilość informacji jaka trzeba pobrać przez http, sama analiza nie obciąża praktycznie wcale procesora i działa natychmiastowo. Użycie procesora to max 2%, pamięci ok 23MB. Przypuszczam ze źródłem problemu moze byc właśnie funkcja pobierająca dane z serwera.

Nie potrafie rozwiazac tego problemu za pomoca googla :P
Proszę o pomoc.

0

pomocne moga okazać sie informacje o wątkach (klasa TThread), ewentualnie (ale w tym przypadku raczej mniej) Application.ProcessMessages.

Proponuje, wpakowac calosc (odczytwanie/http, analiza) do watku, a komponenty odnawiac za pomoca synchronize.

Tu art o wątkach

Wątki

0

Dokladnie o cos takiego mi chodzilo, teraz wszystko dziala swietnie

Wielkie dzieki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1