AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OTL - Task2 durch Task1 überwachen

Ein Thema von hschmid67 · begonnen am 6. Jan 2019 · letzter Beitrag vom 7. Jan 2019
 
hschmid67

Registriert seit: 2. Jul 2012
Ort: Weilheim i. Obb.
75 Beiträge
 
Delphi 12 Athens
 
#1

OTL - Task2 durch Task1 überwachen

  Alt 6. Jan 2019, 16:44
Hallo zusammen,

evtl. muss ich diese Frage ja besser in stackoverflow stellen, aber weil ich mit dem Forum hier so gute Erfahrungen gemacht habe, probiere ich es erstmal so. Wenn das unpassend sein sollte, bitte um kurze Rückmeldung.

Es geht um die OmniThreadLibrary. Ich möchte gerne einen Task durch einen anderen überwachen und ggf. neu starten, wenn er denn "abgestürzt" ist.

Meine Versuche gehen bisher so, dass ich zwei Variablen im Formular definiere, Task1 und Task2. Dann starte ich mit einem Button den Task1, der den zweiten Task2 starten soll, wenn Task2 denn noch (oder inzwischen wieder) nil geworden ist:

Delphi-Quellcode:
  Task1 := CreateTask(
    procedure(const mTask: IOmniTask)
    begin
      while not mTask.Terminated do
      begin
        Sleep(1000);
        // Task2 erzeugen und starten, wenn er denn noch nicht existiert
        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;
Wenn ich jetzt versuche, zunächst den inneren Task zu beenden mit

Task2.Terminate(10000); erhalte ich folgende Fehlermeldung:

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

Den äußeren Task kann ich mit

Task1.Terminate(10000); problemlos beenden...

Zunächst verstehe ich nicht, was hier passiert. Vielleicht kann es mir jemand erklären? - Und dann wäre es schön, wenn mir jemand eine Lösung für mein Problem hätte Ziel wäre es ja, dass der Task1 den Task2 überwacht und neu startet, sobald der Task2 - aus welchen Gründen auch immer - abgestürzt oder beendet ist.

Herzliche Grüße
Harald
Harald Schmid
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz