-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmv.Process.NameDelphiThreads.pas
107 lines (97 loc) · 2.89 KB
/
mv.Process.NameDelphiThreads.pas
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
unit mv.Process.NameDelphiThreads;
interface
uses
WinAPI.Windows,
mv.Logger;
procedure NameDelphiThreads(const pMainThreadId:THandle);
//procedure KillDelphiThreads(const pMainThreadId:THandle);
implementation
uses
System.SysUtils,
System.Classes,
WinAPI.TlHelp32;
procedure NameDelphiThreads(const pMainThreadId:THandle);
var
vSnapshot:THandle;
vProcessId:THandle;
vTE32:TThreadEntry32;
i:Integer;
begin
vProcessId := GetCurrentProcessId();
vSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, vProcessId);
if vSnapshot <> INVALID_HANDLE_VALUE then
begin
try
vTE32.dwSize := SizeOf(vTE32); //If you do not initialize dwSize, Thread32First fails.
if Thread32First(vSnapshot, vTE32) then
begin
i := 1;
repeat
if vTE32.th32OwnerProcessID = vProcessId then
begin
if vTE32.th32ThreadID = pMainThreadId then
begin
TThread.NameThreadForDebugging('DelphiCreated_Main', pMainThreadId);
end
else
begin
TThread.NameThreadForDebugging('DelphiCreated_' + AnsiString(IntToStr(i)), vTE32.th32ThreadID);
Inc(i);
end;
end;
until not Thread32Next(vSnapshot, vTE32);
end;
finally
CloseHandle(vSnapshot);
end;
end;
end;
{
procedure KillDelphiThreads(const pMainThreadId:THandle);
var
vSnapshot:THandle;
vProcessId:THandle;
vTE32:TThreadEntry32;
i:Integer;
begin
vProcessId := GetCurrentProcessId();
vSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, vProcessId);
if vSnapshot <> INVALID_HANDLE_VALUE then
begin
try
vTE32.dwSize := SizeOf(vTE32); //If you do not initialize dwSize, Thread32First fails.
if Thread32First(vSnapshot, vTE32) then
begin
i := 1;
repeat
if vTE32.th32OwnerProcessID = vProcessId then
begin
if vTE32.th32ThreadID = pMainThreadId then
begin
//TThread.NameThreadForDebugging('DelphiCreated_Main', pMainThreadId);
Logger.Log('Trying to kill MAIN THREAD ' + IntToStr(vTE32.th32ThreadID));
TerminateThread(vTE32.th32ThreadID, 0);
end
else
begin
//TThread.NameThreadForDebugging('DelphiCreated_' + AnsiString(IntToStr(i)), vTE32.th32ThreadID);
Logger.Log('Trying to kill thread ' + IntToStr(vTE32.th32ThreadID));
TerminateThread(vTE32.th32ThreadID, 0);
Inc(i);
end;
end;
until not Thread32Next(vSnapshot, vTE32);
end;
finally
CloseHandle(vSnapshot);
end;
end;
end;
}
{$IFDEF DEBUG}
initialization
NameDelphiThreads(GetCurrentThreadId);
{$ENDIF}
finalization
// KillDelphiThreads(GetCurrentThreadId);
end.