Advertisement
Guest User

unt_Thread

a guest
Nov 22nd, 2011
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.34 KB | None | 0 0
  1. unit unt_Thread;
  2.  
  3. interface
  4.  
  5. uses
  6.   { VCL }
  7.   Classes,
  8.   Windows,
  9.   SysUtils,
  10.   TlHelp32,
  11.   { DevExpress }
  12.   dxCore;
  13.  
  14. type
  15.   /// <summary>
  16.   /// Extender of TThread
  17.   /// </summary>
  18.   /// <example>
  19.   /// <code>
  20.   /// Thread1 := TThread.CreateAnonumoysThread(procedure()begin...end).NameThread('MyThread').Start;
  21.   /// or
  22.   /// TThread.NameExternalThreads;
  23.   /// </code>
  24.   /// </example>
  25.   TThreadHelper = class helper for TThread
  26.   strict private
  27.     /// <summary>
  28.     /// Holds a list of the already known (named) thread ids
  29.     /// </summary>
  30.     class var FKnownThreadIds: TArray<Cardinal>;
  31.   public
  32.     /// <summary>
  33.     /// A wrapper of NameThreadForDebugging which
  34.     /// 1. keeps track of the already named threads
  35.     /// 2. can be used to do chained calls like TThread.CreateAnonumoysThread(procedure()begin...end).NameThread('MyThread').Start;
  36.     /// 3. is shorter to type
  37.     /// </summary>
  38.     function NameThread(const ThreadName: AnsiString): TThread; overload;
  39.     class procedure NameThread(const ThreadName: AnsiString; const ThreadId: Cardinal); overload;
  40.     /// <summary>
  41.     /// Give names to externally created threads such as the ones spawned by TWebBrowser.Navigate method
  42.     /// URL : http://stackoverflow.com/questions/8222209/how-to-name-the-twebbrowser-threads
  43.     /// </summary>
  44.     class procedure NameExternalThreads;
  45.   end;
  46.  
  47. implementation
  48.  
  49. { TThreadHelper }
  50.  
  51. class procedure TThreadHelper.NameExternalThreads;
  52. var
  53.   ProcessId: Cardinal;
  54.   hSnapshot: THandle;
  55.   ThreadEnty: TThreadEntry32;
  56.   i: Integer;
  57.   IsAlreadyKnown: Boolean;
  58. begin
  59.   // Windows 2000 and above only
  60.   if not dxCore.IsWin2KOrLater then
  61.     Exit;
  62.   // URL : http://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx
  63.   ProcessId := GetCurrentProcessId;
  64.   hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0 { ProcessId = Current, ignored for SNAPTHREAD });
  65.   try
  66.     if hSnapshot <> INVALID_HANDLE_VALUE then
  67.     begin
  68.       ThreadEnty.dwSize := SizeOf(TThreadEntry32);
  69.       // URL : http://msdn.microsoft.com/en-us/library/windows/desktop/ms686852(v=vs.85).aspx
  70.       if Thread32First(hSnapshot, ThreadEnty) then
  71.       begin
  72.         repeat
  73.           if ThreadEnty.th32OwnerProcessID <> ProcessId then
  74.             Continue;
  75.           if ThreadEnty.th32ThreadID = MainThreadID then
  76.             Continue;
  77.           IsAlreadyKnown := false;
  78.           for i := Low(FKnownThreadIds) to High(FKnownThreadIds) do
  79.             if FKnownThreadIds[i] = ThreadEnty.th32ThreadID then
  80.             begin
  81.               IsAlreadyKnown := true;
  82.               Break;
  83.             end;
  84.           if not IsAlreadyKnown then
  85.             NameThread(AnsiString('External Thread - ' + IntToStr(ThreadEnty.th32ThreadID)), ThreadEnty.th32ThreadID);
  86.         until not Thread32Next(hSnapshot, ThreadEnty);
  87.       end;
  88.     end;
  89.   finally
  90.     CloseHandle(hSnapshot);
  91.   end;
  92. end;
  93.  
  94. function TThreadHelper.NameThread(const ThreadName: AnsiString): TThread;
  95. begin
  96.   NameThread(ThreadName, Self.ThreadID);
  97.   Result := Self;
  98. end;
  99.  
  100. class procedure TThreadHelper.NameThread(const ThreadName: AnsiString; const ThreadId: Cardinal);
  101. begin
  102.   TThread.NameThreadForDebugging(ThreadName, ThreadId);
  103.   SetLength(FKnownThreadIds, Succ(Length(FKnownThreadIds)));
  104.   FKnownThreadIds[Pred(Length(FKnownThreadIds))] := ThreadId;
  105. end;
  106.  
  107. end.
  108.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement