Utrata połączenia - zawieszenie aplikacji - obsługa zdarzenia

0

Witam was,

Używam komponentu MyDac do obsługi z SQL-em. Komponent stworzony na formie głównej w przypadku zerwania połączenia realizowane jest zdarzenie OnLostConnection (tutaj następuje próba wznowienia połączenia). Zdarzenie jest wykonywane tyla razy aż się nie połączy ponownie z bazą sql.

Chciałem aby w tym momencie w tym zdarzeniu program utworzył małą formę z informacją że trwa próba wznowienia połączenia z przyciskami np zakończ program, anuluj itp.

Mój problem polega na tym że nie wiem jak to ugryść. Jeżeli stworzę formę w zdarzenie onLostConnection po przez np. form2 := tform2.Create(nil) to nie sprawdzi się bo forma główna jest zajęta cały czas zdarzeniem onLostConnection. (Aplikacja zawieszona). Utworzenie wątku który ma wyświetlać form2 i je obsługiwać też nie sprawdza się bo cały czas nasza aplikacja jest jakby zawieszona.

Jedyne co mi przychodzi do głowy to:

  • użycie w onLostConnection -> Application.ProcessMessage (ale to mało profesionalne rozwiązanie i ma swoje wady)
  • Utworzyć wątek w którym tworzony jest dynamicznie komponent MyDac i go obsługiwać w nowo utworzonym wątku.

Jak Wy byście radzili?

0

Czy jest ktoś wstanie mnie nakierować na rozwiązanie mojego problemu?. Poniżej trochę kody gdybym niejasno to opisał:

var MyConnection : TMyConnection;MyDAC;

procedure tform1.button(onClick: Sender);
var
   MyData: TMyQuery;
   i: integer;
begin
  MyData := TMyQuery.Create(nil);
  try
    MyData.Connection := MyConnection;
    for i := 0 to 200 do
    begin
      Label1.Caption := inttostr(i);
      Label1.Update;
      MyData.SQL.Text := 'SHOW TABLES LIKE ''' + Key_rafloSystem + '''';
      MyData.ExecSQL;
      sleep(40);   
   end;
  finally
    MyData.Free;
  end;
end;

procedure Tform1.MyConnectionConnectionLost(Sender: TObject; Component: TComponent; ConnLostCause: TConnLostCause; var RetryMode: TRetryMode);
begin
    if not assigned(form2) then begin
         Form2 := TForm2.Create(nil);
         Form2.Show;
         end; 
    RetryMode := rmReconnectExecute;
end;

procedure TfRaflo.MyConnectionAfterConnect(Sender: TObject);
begin
  if Assigned(form2) then
    FreeAndNil(form2)
end;

Zasada działania:

  • Klikamy button, poczym następuje połączenie z bazą MySQL i wykonywane jest 200 razy polecenie SHOW TABLES
  • W momencie wykonywania petli od 0 do 200 rozłączam połączenie "internet" (np po przez wyciągniecie wtyczki itp).
  • W tym momencie wykonywana jest procedure LostConnection i tworzona forma2 ( z przyciskami itp). RetryMode := rmReconnectExecute; Oznacza ze onLostConnection jest tak długo wykonywane az połączenie się nie wznowi.
  • Gdy połączenie przywrócimy wykonywana jest procedura AfterConnect i zamykana jest forma2
    Z powodu iż wątek główny jest zajęty forma2 jak i cała aplikacja "wisi" w systemie. Czy jedynym rozwiązaniem jest używanie komponentu MyConnection w odrębnym wątku?
0

Nawet bez rozłączania forma główna się zawiesi podczas przetwarzania tej pętli - osobny wątek załatwiłby sprawę wieszania się aplikacji, ale po co tyle razy odświeżasz to zapytanie? Poza tym chyba źle tworzysz formę - jej instancja jest już tworzona w głównym pliku projektu, wystarczy samo Show.

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