Niezale?żny wątek

0

Czy da się w delphi utworzyć wątek niezależny odreszty programu? Już wyjaśniam: w programie ładuję biblioteki (pluginy od innego programu). Niestety zwykle przy zamknięciu głównego okna pluginu, wykorzystywana jest funkcja postquitmessage, która skutecznie zabija cały proces, wraz z całym moim programem. Co ciekawe, dzieje się tak tylko wtedy, gdy zostanie naciśnięty krzyżyk, kiedy jest wywoływana w bibliotece funkcja zamykająca (która wykorzystuje postquitmessage), plugin zamyka się bez problemu, nie zamykajac przy tym mojej aplikacji, choć ona też wykorzystuje postquitmessage. Czytałem, że rozwiązaniem tego problemu jest utworzenie wątku niezależnego od aplikacji. Jak to zrobić w delphi?

0

PostQuitMessage nie zamyka twojego programu tylko okno utworzone w nim, co pewnie u Ciebie po pętli GetMessage kończy program. Nie da się utworzyć oddzielnego wątku, dlatego, że każdy nowy wątek "żyje" tylko w obrębie danego procesu.

Dodatek:
Wykorzystaj w swoim programie komunikat WM_CLOSE. Jeżeli zwróci on wartość zero to się nie zamknie, zaś wykorzystanie DefWindowProc powoduje zamknięcie go.

0

Niestety to nie działa. Obsługuję komunikat WM_CLOSE zamiast WM_DESTROY i rzeczywiście okienka nie można zamknąć w normalny sposób, lecz przy zamykaniu pluginu nadal program się zamyka.

// Szczerze mówiąc, nie mogę znaleźć trego źródła. Na pierwszych kilku stronach działu delphi oraz c nie znalazłem nic lofixa, ani nawet nic, co przypominałoby mój problem.

// Twardy:
Wiem (tak mi się przynajmniej wydaje), o co chodziło z obsługą WM_CLOSE. Niestety to nie działa. Oto kod:

function MessageLoop(H : HWND; Msg: UINT; wPar : WPARAM; lPar: LPARAM): 
LRESULT; stdcall;
var
i:integer; 
begin 
Result := 0;
case Msg of
WM_CLOSE:;//wyłączone
WM_TIMER:;//coś tam
else 
Result := DefWindowProc(H, Msg, wPar, lPar); 
end; 
end; 

// Czytałem trochę o postquitmessage. Wcale nie zamyka ona okna (tzn nie bezpośrednio), tylko wysyła komunikat WM_QUIT do głównego okna programu. Czy jest jakiś sposób na zablokowanie tego? Blokowanie w pętli komunikatów nic nie da, ponieważ komunikat jest wysyłany już po rozpoczęciu niszczenia aplikacji. Może jakiś hook? Tylko jakiego hooka użyć (jeśli to w ogóle wyjdzie z hookiem)? Widzialemw SetWindowsHookEx prawie odpowiednie, z tym małym kruczkiem, ze nie można było zablokować komunikatu, jedynie obejrzeć.

0

Utwrzenie całkowicie nowego procesu jest mozliwe - polecam zainteresować się kodem, który ostatnio Lofix wrzucił i obejrzeć w WinSDK funkcje pokrewne do tych użytych....

0

Proces można utworzyć, ale nie wątek (JEST CHYBA RÓŻNICA). Utwórz globalną zmienną, która będzie obsługiwana w twoim programie, jeżeli ona (np. typ bool) nie będzie true, to nie kończyprogramu

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