Ali Keshavarz's Website
RSS icon Home icon
  • ProcessInfo 1.5 is released with Win64 support

    Posted on September 12th, 2011 Ali Keshavarz 5 comments

    ProcessInfo 1.5 is released. The changes in this release are:

    • Added support for Win64 and Delphi XE2.
    • Added TProcessItem.CloseProcess method to close a process normally (not forcefully).
    • Added TProcessItem.CurrentProcess property. This property always refers to the current process in the list of running processes.
    • Added PrivateWorkingSetSize property to TProcessItem.MemoryInfo.
    • Added global  ProcessInformation function. This function returns a global instance of TProcessInfo. The instance will be freed when the application is terminating.
    • Fixed a few minor bugs.

    To download ProcessInfo 1.5, please go to ProcessInfo page.

  • ProcessInfo 1.3 is released

    Posted on July 26th, 2010 Ali Keshavarz 2 comments

    Hi,

    ProcessInfo 1.3 is released. The changes in this release are:

    • CPU usage is added to TProcessItem.
    • Is64Bit is added to TProcessItem.
    • IsAccessible is added to TProcessItem.
    • Setting thread priority is added to TThreadItem.
    • Setting process base priority class is added to TProcessItem.

    To download ProcessInfo 1.3, please go to ProcessInfo page.

  • How to use TProcessInfo #2

    Posted on July 26th, 2010 Ali Keshavarz No comments

    I had a few e-mails and comments about using TProcessInfo, so I decided to answer those questions in new blog posts.

    Q1: How can we find a module which is running a specific thread, giving a thread ID:

    A: First of all, Threads are not assigned to modules, they are assigned to processes. You can find a process which is running the thread, by searching in the list of threads owned by each running process. Here is a sample code:

    function FindProcessByThreadID(ID: Cardinal): TProcessItem;
    var
      ProcessInfo : TProcessInfo;
      AProcess : TProcessItem;
    begin
      Result := nil;
      ProcessInfo := TProcessInfo.Create(nil);
      try
        for AProcess in ProcessInfo.RunningProcesses do
        begin
          if Assigned(AProcess.Threads.FindByID(ID)) then
          begin
            Result := AProcess;
            Exit;
          end;
        end;
      finally
        ProcessInfo.Free;
      end;
    end;
    

    FindProcessByThreadID iterates over all running processes, and checks which of them has a thread with the given ID. If a process owns a thread with that ID, it will return that process as a TProcessItem object.

    Once you have the process object, you can get more information about the process or the specific thread, or you can kill the process, or suspend the thread. For example:

    var
      Process : TProcessItem;
    begin
      Process := FindProcessByThreadID(StrToInt(3444));
      if Assigned(Process) then
        ShowMessage(Process.FullPath);
    end;
    

    The above code looks for a thread with its ID = 3444, and if it is found, it provides full path of the EXE file for that process.

    Q2: How can we get memory consumption for a given process?

    A: You can read memory info for a given process using TProcessItem.MemoryInfo. It provides different info about the memory the process is consuming. Here is an example for reading memory info of Google Chrome process while it is running :

    var
      ProcessInfo : TProcessInfo;
      AProcess : TProcessItem;
    begin
      ProcessInfo := TProcessInfo.Create(nil);
      try
        AProcess := ProcessInfo.RunningProcesses.FindByName('Chrome.exe');
        if Assigned(AProcess) then
          ShowMessage(Format('WorkingSet Size = %d, Peak WorkingSet Size = %d',
                             [AProcess.MemoryInfo.WorkingSetSize,
                              AProcess.MemoryInfo.PeakWorkingSetSize]));
      finally
        ProcessInfo.Free;
      end;
    end;
    

    First we search for Chrome.exe process among running processes. Once the process is found, we read its current working set size, and pick working set size through MemoryInfo property, and show them in a message box. The values returned are in Bytes.

    Q3: How can we get process base priority class or change it?

    A: You can access base priority class for a given process or modify it (added in version 1.3), using TProcessItem.

    PriorityClassBase. Be careful, adjusting a base priority class of a given process inappropriately might make other processes unresponsive! Here is a example code:

    var
      ProcessInfo : TProcessInfo;
      AProcess : TProcessItem;
    begin
      ProcessInfo := TProcessInfo.Create(nil);
      try
        AProcess := ProcessInfo.RunningProcesses.FindByName('firefox.exe');
        if Assigned(AProcess) then
          AProcess.PriorityClassBase := BELOW_NORMAL_PRIORITY_CLASS;
      finally
        ProcessInfo.Free;
      end;
    end;
    

    You can also change each priority of  each thread within a process by setting BasePriority property of that TThreadItem instace.

    Q4: How can I check if a process is 64-bit?

    A: You can check this by reading TProcessItem.Is64Bits property.

    Q5: How can I get CPU usage for a given process?

    A: You can get CPU usage by reading TProcessItem.CPUUsage property.

    I hope these few answers and sample source codes can help you use Process Info. For other examples of using Process Info, please refer to this post: How to use TProcessInfo

    If there is any question regarding using Process Info, or anything about Delphi that you think worth being mentioned in Tips & Tricks section of this website, please contact me, and let me know about it.

    Have Fun!

  • ProcessInfo 1.2 is released

    Posted on January 13th, 2010 Ali Keshavarz 1 comment

    Hi,

    ProcessInfo 1.2 is released. The changes in this release are:

    • SuspendThread, ResumeThread, TerminateThread methods are added to TThreadItem class. Now you can pause/resume/terminate any running thread in a given process.
    • TProcessInfo.Active and TAppInfo.Active are published properties, and can be set in design mode.
    • TProcessInfo.RunningProcesses and TAppInfo.RunningApplications automatically populate the corresponding list if UpdateList method is not called yet. This means even if you don’t activate any of these two components, or call their UpdateList method, accessing RunningProcesses or RunningApplications does not cause Access Violation.

    To download ProcessInfo 1.2, please go to ProcessInfo page.

    Regards.

  • ProcessInfo 1.1 is released

    Posted on October 22nd, 2009 Ali Keshavarz 1 comment

    Hi,

    I released a new version of ProcessInfo. In this release I added these features:

    • Enumerators are added for Windows, Threads, Modules, and Processes; Now you can use for-in statements in D2007 and above for iterating on running processes list, or modules\threads\windows of a given process.
    • TProcessItem.UserName is added; This property returns domain name\user name which is running the process.
    • TProocessInfo.AdjustDebugPrivilage is added; This method is called automatically.
      TThreadItem.ToString & TProcessItem.ToString are added; TThreadItem.ToString returns ThreadID. TProcess.ToString returns process EXE name.
    • Now supports Delphi 7,2007,2009, 2010; Some conditional compiler directives are added so that it can be used in D7, 2007, 2009, and 2010. I tested it in D7, 2009, and 2010. It should work in D2007 too.

    To download ProcessInfo 1.1, please go to ProcessInfo page.

    Regards.

  • How to use TProcessInfo

    Posted on September 11th, 2009 Ali Keshavarz 5 comments

    The other day I published Process Info component pack which contains TProcessInfo and TAppInfo. A sample task manager was also published as demo.

    I thought maybe it is a good idea to talk about these components and some of their usages by providing some sample source codes. So I will start with TProcessInfo.

    Read the rest of this entry »

  • Process Info

    Posted on September 8th, 2009 Ali Keshavarz 3 comments

    Process Info is a free Delphi component package containing two components:

    • TProcessInfo
    • TAppInfo

    TProcessInfo provides a list of running processes. TAppInfo provides a list running applications (similar to Application tab in Windows Task Manager). Both components can update their list frequently based on the value of Interval property.

    Read the rest of this entry »