J'ai une DLL qui crée un Thread sur son INITIALIZATION et le termine, attend la terminaison et le detruit sur la FINALIZATION...
Lors du chargement de la DLL, l'INITIALIZATION est appelé et crée correctement le thread qui vit normalement. Lors du dechargement de la DLL, la FINALIZATION est appelée et il s'avere que l'attente de la fin du thread bloque indéfiniement, alors que le thread "execute" prend bien en compte les demande de terminate.
Le même code dans une fonction de la DLL exportée et appelée avant dechargement marche bien (ainsi que dans un executable). Cette solution est acceptable dans mon cas, mais j'aimerai bien comprendre pourquoi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Library MyMythe1; {$R *.res} uses DLLMain in 'DLLMain.pas', DLLThread in 'DLLThread.pas'; end.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 // ------------------------------------------------------------------ // ------------------------------------------------------------------ // ------------------------------------------------------------------ unit DLLMain; interface uses Windows, DLLThread; implementation var MyThread: TMyThread; initialization // Create a thread that is looping until Terminated MyThread := TMyThread.Create(False); finalization // Request for Thread termination MyThread.Terminate; // Wait Thread termination MyThread.WaitFor; // Deadlock Here .... Why ??? // Destruction MyThread.Free; MyThread := nil end.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 // ------------------------------------------------------------------ // ------------------------------------------------------------------ // ------------------------------------------------------------------ unit DLLThread; interface uses Windows, Classes; type TMyThread = class(TThread) procedure Execute; override; end; implementation Procedure TMyThread.Execute; begin while not Terminated do begin Windows.Beep(330, 50); Sleep(2500); end; end; end.
Partager