Jump to content

hschmid67

Members
  • Content Count

    6
  • Joined

  • Last visited

Posts posted by hschmid67


  1. On 11/5/2021 at 9:29 AM, David Heffernan said:

    Why are you looking to use threads? What problem are you trying to solve with threads? Are you aware of the impact of the Python GIL? 

    Hello,

    I have a REST web server written in XData (TMS) and would like to execute a Python script in a service request (ActiveDirectory - using pyad). This would be in a thread - and I cannot be sure that there would not be a parallel request that executes Python in a different thread...

    So it seems to me that the only way to prevent problems with parallel python calls would be to use an object pool for python requests with just one element in the pool. The other request has to wait for the first to finish...

    Regards
    Harald


  2. Hello,

    If I understand everthing right (in the official book about OTL) then one needs no monitor if a task is scheduled (instead of run) - the monitor schould be implicit. I have a very simple example that runs not as expected (using OTL 3.07.6 Tokyo):

     

    This code works (with and without the line ".MonitorWith(OmniEventMonitor1)"

     

    for i := 1 to 3 do
    begin
      CreateTask(
        procedure(const mTask: IOmniTask)
        begin
          CodeSite.Send('curmsg');
        end, 'hallo')
        .MonitorWith(OmniEventMonitor1)
        .Run;
    end;

     

    But this code does not. It works only with the line ".MonitorWith(OmniEventMonitor1)". Without nothing happens (no codesite messages).

     

    for i := 1 to 3 do
    begin
      CreateTask(
        procedure(const mTask: IOmniTask)
        begin
          CodeSite.Send('curmsg');
        end, 'hallo')
        .MonitorWith(OmniEventMonitor1)
        .Schedule;
    end;

    Did I miss something? After the second example I get a memory leak after closing my app (without the monitorwith).

     

    Regards

    Harald


  3. using OmniThreadLibrary I'd like to watch a task2 using another task1 to detect, if task2 is stopped or otherwise finished. The aim is to restart task2 if it stopped for any reason. Until now I use the following construct:

      Task1 := CreateTask(
        procedure(const mTask: IOmniTask)
        begin
          while not mTask.Terminated do
          begin
            Sleep(1000);
            // create Task2 and run it, if it is not running
            if Task2 = nil then
            begin
              Task2 := CreateTask(
                procedure(const mTask: IOmniTask)
                begin
                  while not mTask.Terminated do
                  begin
                    Sleep(1000);
                  end;
                end)
                .OnTerminated(procedure(const mTask: IOmniTaskControl)
                  begin
                    Task2 := nil;
                  end);
              Task2.Run;
            end;
          end;
        end)
        .OnTerminated(
          procedure(const mTask: IOmniTaskControl)
          begin
            Task1 := nil;
          end);
      Task1.Run;

    If I try to terminate the inner task2 with this code

    Task2.Terminate(10000);

    I get the following error:

    Quote

    TOmniEventMonitorPool.Release: Monitor is not allocated for thread xxx.

     

    The same code work well with task1:

    Task1.Terminate(10000);

    Two questions:

    1. I do not understand, what goes wrong with this code and what the "monitoring"-error means.
    2. How can I get task1 to start task2 properly, and restart it, if task2 finished?

    Thanks in advance

×