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ę