PascalDragon hat geschrieben: Mi 25. Mai 2022, 09:19Nein. Wie die anderen es bereits geschrieben haben: Inlining darf das Verhalten des Codes nicht ändern
Ja, habe ich verstanden. Wie gesagt, ich hätte es anders erwartet, auch ohne Inlining, daß entweder der Constructor noch die zum MainThread gehörige ThreadID zurückliefert oder eben konsequenter Weise, wenn der Constructor eine Methode aufruft, dann eben dort auch die zum Thread gehörige ThreadID zurückgeliefert wird. Wenn es so sein soll, wie es zur Zeit ist, dann ist es halt so und ich werde damit zurechtkommen. Deshalb habe ich hier gefragt.
PascalDragon hat geschrieben: Mi 25. Mai 2022, 09:19Das ist aber ein recht fragiles System.
Nein. Das Logging funktioniert seit fast zehn Jahren hier so bei einer Anwendung die 24/7 läuft. Die Urversion hatte ich hier mal vor langer Zeit gepostet. Zu finden seit einigen Jahren auch auf
https://svn.code.sf.net/p/michlpackages ... nk/status/. (Den Code habe ich vor vielen Jahren geschrieben und müsste den mal überarbeiten - es fehlt an Zeit

)
PascalDragon hat geschrieben: Mi 25. Mai 2022, 09:19
Wenn dein Threadobjekt zum Beispiel eine Methode hat, um ihm vom Hauptthread eine Aufgabe zuzuweisen (was dann zum Beispiel in eine Queue eingestellt wird) und du in dieser Methode ebenfalls über dein Log ausgibst, dann hast du wieder verschiedene Thread IDs.
Aber genau das ist der Witz der Übung!!! Ich erkenne welcher Thread, welche Methode aufruft und welche Methode welche Methode aufruft.
OK, weiß nicht, ob das von Interesse ist, vielleicht sollte ich es kurz erklären.
Normalerweise nehme ich beim Erstellen ein Makro (bei mir drei Tasten <S>, <A>, <Enter>), damit wird der komplette Logteil erstellt (incl. Methodenname). Sieht dann so z.B. aus (für jemanden, der nicht täglich damit arbeit, sicher unübersichtlich, für mich ist es gut):
Code: Alles auswählen
procedure TMainForm.Test(var TheMessage: TLMessage);
begin
{$ifdef statvrmain} try
if StatIn then StatLn('TMainForm.Test', '');
{$endif}
// Do Something
{$ifdef statvrmain} finally StatOut; end; {$endif}
end;
Beim hineinkommen in die Methode wird ein Zähler um die ThreadID erhöht (
StatIn), beim Verlassen (
StatOut) verringert (beim Create und Destroy wollte ich schlauer sein und nur einmal erhöhen und verringern - geht nicht, wie erläutert). Wenn ich denke, daß es für das Log wichtig ist, gebe ich noch dem Logtext (
StatLn) beim Hineinkommen in die Methode oder beim Verlassen Variablen (z.B. Parameter oder ein Result einer Funktion) usw. mit.
Das Ganze wird über IPC in ein externes Programm übermittelt, wo ich die ganze Zeit nachverfolgen kann, was die eigentliche Anwendung macht.
Bei einem Absturz oder sonstigen Fehlern sehe ich genau, was zuletzt gemacht wurde.
Ein drittes Programm, kann ein Logfile lesen, es wird links in einem VTV die chronologische Abfolge gezeigt, rechts in einem VTV die Abfolge der jeweiligen Threads. Beide VTV sind synchronisiert, sodaß man immer sehen kann, welcher Thread was gemacht hat.
Die Anwendung selbst besteht zur Zeit aus vier Einzelprogrammen, die alle auf den gleichen Log zugreifen. Das ist auch gut so, da die Programme alle auf eine PostgreSQL Datenbank zugreifen und dort sich gegenseitig Aufgaben zuweisen.
Wie gesagt, ich finde es komfortabel und hat sich neben dem Debuggen als eine für mich sehr wichtige Fehlersuchmöglichkeit erwiesen, besonders bei Fehlern, die erst nach tagelangem Laufen einer Anwendung auftreten.