wątki - jak wykryć koniec watku

0

mam program, który łączy siez bazą danych i robi to w oddzielnym watku. moje pytanie: jak zrobić żeby wywołać wątek - on łączy sie z baza - i czekać az sie połączy ale tak by po wykonaniu się instrukcji przez ten wątek, program działał dalej. próbowałem z funkcją WaitForSingleObject i kod wykonuje sie w zaplanowane jprzeze mnie kolejnosci, ale program w momencie łączenia wisi.
chodzi mi po prostu o takie cos:

  1. wyswietla sie okienko i wypisuje ze sie łączy
    • zaczyna dzialac wątek
    • w kazdej chwili mozna anulowac
  2. po połączeniu się wykonuje sie dalej kod lub jesli anulowane to nic
0

hmm.. chyba nie ma onsuspend ale mozesz sprawdzic
a jak nie bedzie to w timerze sprawdzaj czy watek jest suspended :)

0

Ale po co.. przecież wątek ma dostęp do zmiennych globalnych, a poza tym - po wykonaniu wątku aplikacja dalej działa - więc - o co chodzi?

0

chyba mnie nie zrozumieliście :)
jest taka sprawa, że jak się będę łączył z bazą bez wątku to może to długo zejść. dlatego przygotowałem sobie takie coś co rysuje po formie taki jakby progress bar i ma oznaczać że coś się dzieje. no i jeśli nie będzie wątku to w momencie gdy się będzie łączyło to nic innego nie będzie się działo - nie bedzie rysowało, nie bedzie siędało nic zrobić - brak odpowiedzi. i teraz zrobiłe msobie dwa wątki - jeden do rysowania tego progressu a drugi do operacji na bazie danych - m.in. łączenia się z nią. i chciałem zrobić funkcję: DatabaseConnect(), którą będę mógł sobie wywoływać w paru miejscach i ona będzie się troszczyłą o nawiązanie połączenia.

if not db.Connected then
    DatabaseConnect();

i w tej funkcji właśnie wywoływany jest wątek, który łączy.

procedure TMain.DatabaseConnect();
begin
  // wyświetlanie okienko z komunikatem o łączeniu
  TDatabaseAction.Create(atConnect, '', nil); // tutaj wywołany ten wątek do działania na bazie danych
end;

i chciałbym żeby procedura skończyła swoje działanie wraz z połaczeniem z bazą danych (czyli aż wątek zakończy swoje działanie), ale w taki sposób, żeby program nie 'wisiał', czyli żeby można było np. nacisknąć jakiś przycisk, bo jakby miał wisiec to nie ma sensu w ogóle ten wątek.

jak zrobiłem takie coś:

procedure TMain.DatabaseConnect();
var
  t: TDatabaseAction;
begin
  // wyświetlanie okienko z komunikatem o łączeniu
  t := TDatabaseAction.Create(atConnect, '', nil); // tutaj wywołany ten wątek do działania na bazie danych
  if WaitForSingleObject(t.handle, INFINITE) = WAIT_OBJECT_0 then
  //wyswietlenie napisu o stanie poloczenia
end;

to wątek główny czekał na wątek łaczący z bazą danych i w tedy nie ma sensu w ogóle wywoływać ten wątek.

podsumowując :)
takie coś jak WaitForSingleObject tylko żeby to czekało nie blokując wątku głównego :) żeby wraz z zakończeniem wątku kończyć procedurę

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