Einzelnen Beitrag anzeigen

Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
679 Beiträge
 
Delphi 10.4 Sydney
 
#1

Thread freigeben, wenn er festklebt :)

  Alt 31. Mär 2015, 18:39
Delphi-Version: 5
Hallo,

hab mal eine Frage...
Ich lagere gerade einige DB Prozesse in einen service aus, welcher wiederrum auf dem Server läuft. Dazu habe ich mir einen ThreadPool gebaut und Datenbanken klassifiziert, ob sie in einem Thread allein laufen (weil viel genutzt), oder ob sie ihn sich mit 3 oder 15 DBs teilen (Also max DBs ist 1, 4 oder 16 bis jetzt)
In denen führe ich eine stored procedure aus (über UniDAC), welche dann entscheidet, welche Aufgabe erledigt werden soll. Soweit, so gut.. das geht auch alles sehr schön und flink, auch die Erzeugung und Schliessung von Threads.
Jetzt kommt der theoretische Fall den ich bedenken muss :

Wenn die Stored Procedure aus irgendwelchen Gründen mal nicht zurück kommt, klebt sich der thread ja fest (und wenn er geshared ist mit anderen DBs, wird bei denen ja auch nichts mehr ausgeführt). Dazu habe ich ein Ping Pong eingebaut über Windows Nachrichten, welche alle 30 sekunden die threads fragt, ob sie noch leben. Heisst, wenn ein thread nicht antwortet, schlägt der timer nach 30 sekunden wieder auf und erkennt, dass der thread nicht geantwortet hat und soll ihn beenden und neu erstellen (habe alle information, um ihn neu zu starten).

Problem ist, beim Thread.Free bleibt alles stehen dann. wenn threads sich normal dort beenden (weil der letzte User raus ist), geht alles toll. Aber ich kann ja nicht Terminated auf true setzen, weil der thread ja blockiert ist.

Gibt es ideen ?


Code:
    Try
      UsageLevel := vtThreadDataUsageLevel.Value;
      OldThreadId := vtThreadDataThreadId.Value;
      EnterCriticalSection(aCriticalSection);
      FpThread := TDatabaseConnectionThread(Pointer(vtThreadDataaObj.AsInteger));
      FpThread.Free;
      LeaveCriticalSection(aCriticalSection);
    except
      On E: Exception Do
        CodeSite.Send( csmLevel1, 'Error deleting thread', E.Message);
    End;
  Mit Zitat antworten Zitat