Forum Discussion

m_essaid's avatar
m_essaid
Valued Contributor
5 years ago

CTF Loader

Hi,

Most of us must run our test nightly. I have personnaly several machines running on Win 10 Pro, and updated to last version (1909).

My tests are very common in the way that they simulate keystrokes and mouse clicks on an accounting program.

An annoying thing is that I have a process, CTF Loader (ctfmon.exe) that takes more and more size all along the nights and reaches up to 1,5Gb (!!!) in memory, leading the machine to crash due of lack of memory.

The only solution for me is to kill periodicaly this process or reboot the machines.

if I try to disable Touch Keyboard and Handwriting Panel Service, the same problem still occurs in another process name : Host Process for Windows Tasks, which still runs MsCTFMonitor.

Any hint please ?

Thank you,

  • Process filter has to do with processes that show up in Windows.  Basically, if you go to Task manager and look at the list of processes, whatever process name shows there, that's how you filter the process.  So, my guess is that CTFMon is calling the DLL... so, to exclude the DLL, you need to filter out CTFMonitor

  • Hi,

    Finaly I found a solution : I ask TC to close the process before the tests. I had to adapt slightly the following method which closes a process :

     

    procedure KillProcessus(NomProcessus: string);
    var
      p, IsClosed;
    begin
      p := Sys.FindChild('ProcessName', NomProcessus);
      while (p.Exists) do
      begin
        p.Close;
        IsClosed:= p.WaitProperty('Exists', False);
        if not IsClosed then
          p.Terminate;
        p:= Sys.FindChild('ProcessName', NomProcessus);
      end;  
    end;

    This procedure don't work because there is no window for this process. So I used this one which work pretty fine :

     

    procedure KillProcessusCTFMon(NomProcessus: string);
    var
      p, IsClosed;
    begin
      p := Sys.FindChild('ProcessName', NomProcessus);
      while (p.Exists) do
      begin
        p.Terminate;
        p:= Sys.FindChild('ProcessName', NomProcessus);
      end;  
    end;
  • I googled "ctf loader high memory usage" and saw many articles about disabling it.  You'll need to see which one works best for you.

  • tristaanogre's avatar
    tristaanogre
    Esteemed Contributor

    Are you actually automating something against CTFMON.EXE?  If not, you could exclude it.  Go to Tools -> Current Project Properties -> Open Applications -> Process Filter.  By default, I believe it's set to "ignore selected processes".  Add CTFMON.EXE to the list and see if that helps.

    • m_essaid's avatar
      m_essaid
      Valued Contributor

      Thanks for answering guys,

      Robert it seems to be the "MsCtfMonitor.dll" the culprit, could I disable its usage by the same way (should I enter its name in the process filter) please ?

      Thanks,

      • tristaanogre's avatar
        tristaanogre
        Esteemed Contributor

        Process filter has to do with processes that show up in Windows.  Basically, if you go to Task manager and look at the list of processes, whatever process name shows there, that's how you filter the process.  So, my guess is that CTFMon is calling the DLL... so, to exclude the DLL, you need to filter out CTFMonitor

  • m_essaid's avatar
    m_essaid
    Valued Contributor

    Hi,

    Finaly I found a solution : I ask TC to close the process before the tests. I had to adapt slightly the following method which closes a process :

     

    procedure KillProcessus(NomProcessus: string);
    var
      p, IsClosed;
    begin
      p := Sys.FindChild('ProcessName', NomProcessus);
      while (p.Exists) do
      begin
        p.Close;
        IsClosed:= p.WaitProperty('Exists', False);
        if not IsClosed then
          p.Terminate;
        p:= Sys.FindChild('ProcessName', NomProcessus);
      end;  
    end;

    This procedure don't work because there is no window for this process. So I used this one which work pretty fine :

     

    procedure KillProcessusCTFMon(NomProcessus: string);
    var
      p, IsClosed;
    begin
      p := Sys.FindChild('ProcessName', NomProcessus);
      while (p.Exists) do
      begin
        p.Terminate;
        p:= Sys.FindChild('ProcessName', NomProcessus);
      end;  
    end;