Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread Problem? (https://www.delphipraxis.net/204238-thread-problem.html)

zeras 9. Mai 2020 18:30

Delphi-Version: 10.3 Rio

Thread Problem?
 
Hallo,

ich suche nach der Ursache eines Fehlers, wobei ich vermute, dass es mit einem Thread zu tun hat.
Zum Thema:
Wir haben auf Arbeit ein Programm, welches u.a. mittels integrierten Python Dateien manipuliert und diese dann wieder abspeichert. Das funktioniert sehr gut. Python wird genutzt, damit man auf verschiedene Parameter reagieren kann.
Nennen wir es Programm1.
Da die Funktionen des Öfteren benötigt wird, habe ich ein Programm2 geschrieben, welches die Funktionalität von Programm1 nutzt. Es ruft Programm1 in einem Thread auf und wartet, bis das Programm1 beendet ist. Danach werden die manipulierten Dateien gesichert.
Nun kommt es vor, dass Programm1 abstürzt.
Was ich bis jetzt herausgefunden habe ist, dass wenn man in den Python Scripts bei Dateioperationen sleep einbaut, dass es vermeintlich besser läuft. Ich könnte mir vorstellen, dass es zu Konflikten mit Dateien kommt, dass beispielsweise eine Datei kopiert wird, aber schon darauf zugegriffen wird.
Kann es sein, dass wenn das Programm1 in einen Thread läuft, dass dann vielleicht anders reagiert, als wenn man das Programm1 einfach nur startet.

Ist das verständlich?

Der schöne Günther 9. Mai 2020 18:35

AW: Thread Problem?
 
Was ist "Programm" - Ein eigener Prozess?

zeras 9. Mai 2020 18:44

AW: Thread Problem?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1464130)
Was ist "Programm" - Ein eigener Prozess?

Programm1 wird als separater Thread vom Programm2 aufgerufen.
Reicht das als Info?

freimatz 9. Mai 2020 20:39

AW: Thread Problem?
 
Ich denke nicht.
Es ist noch viel unklar. Wie bekommst ihr das Python den in Delphi rein?

zeras 9. Mai 2020 22:35

AW: Thread Problem?
 
Vielleicht noch weitere Infos.

Programm1 startet verschiedene Python Scripte. Diese werden abgearbeitet und fertig. Alles OK.
Programm2 startet Programm1 und übergibt auch die gleichen Python Scripte.
Der Unterschied meines Erachtens ist, dass das Programm1 im Hauptthread läuft, das Programm2 als separater Thread im Programm2.
Das Programm2 startet einen Thread mit einer Schleife, die das Programm1 immer wieder mit neuen Parametern startet.
Die Scripte verarbeitet aber immer das Programm1.

Programm1 (ein fertiges Programm, kein Delphi, hier kann nichts geändert werden)
- Programm1 lädt Scripte und führt diese aus. Nach Info meiner Kollegen gibt es keine Probleme.

Programm2 (Delphi Programm, hier kann ich eventuell etwas ändern)
- Programm2 startet
- erzeugt einen Thread, der unabhängig vom UI Thread läuft
- Dateien werden bereitgestellt
- Programm1 wird mit Parameter (Python Scripte) gestartet. Hier werden die Python Scripte verarbeitet. Wenn ich in den Scripten zwischen den Dateimanilulationen immer ein sleep einbaue, scheint das sauber durchzulaufen. Deshalb hier die Frage, ob alles sequenziell verarbeitet wird, oder vielleicht ein Handle noch auf eine Datei zeigt, die vielleicht schon gelöscht wurde. Kann man sicher sein, dass alles sequenziell verarbeitet wird?
- Programm1 ist fertig
- Dateien werden gesichert
- Thread beginnt von vorn mit neuen Daten

Dalai 9. Mai 2020 23:36

AW: Thread Problem?
 
Etwas Grundsätzliches zu den Begrifflichkeiten: Programme arbeiten immer in ihren eigenen Prozessen, und niemals in Threads anderer Programme/Prozesse. Jeder Prozess hat seine eigenen Threads. Selbst wenn man dieselbe EXE mehrfach startet, hat jeder Prozess seine eigenen Threads. Klar, es gibt DLL Injection und andere Spielchen, aber selbst dann läuft kein Prozess von Programm 2 als Thread von Programm 1. Prozesse und Threads sind verschiedene Dinge, erstere enthalten letztere, aber niemals umgekehrt.

Grüße
Dalai

Sinspin 10. Mai 2020 15:53

AW: Thread Problem?
 
Auch wenn ich erstmal nicht davon ausgehe das es am Zusammenspiel zwischen den beiden Programmen liegt, kannst Du mal den Code zeigen mit dem du Programm1 aufrufst? Bzw. wie du es realisiertst das Du auf das Ende von Programm1 wartest.

Ich habe bei mir auch einen Fall bei dem ich auf ein externes Programm warten muss. Das Programm läuft unterschiedlich lange und speichert dann eine Datei. Um nicht bis in alle Ehweigkeit zu warten gibt es einen Timeout, dann muss der Nutzer ran und muss die Daten von Hand einsammeln und auswerten.

Gibt Programm1 irgendwohin Statusmeldungen aus? In die Console? Die könnte man umleiten und auswerten.
Steht irgendwas im Windows Anwendungslog?

zeras 12. Mai 2020 18:53

AW: Thread Problem?
 
Danke für eure Infos.
Es ist offenbar schwierig zu umschreiben.

Meine Frage war eigentlich, ob sich ein Programm anders verhält, wenn man es einfach so startet oder ob man es in einen Thread packt und dort werkeln läßt. Vielleicht gibt es Threadeinstellungen, die ich nicht kenne.
Mittlerweile habe ich weitere Tests machen können und in dem Python Script, welches im Programm ausgeführt wird, eine Änderung vorgenommen. Offenbar gibt es im Programm Überschneidungen mit Schliessen von Dateien und dem gleichzeitigem Zugriff.

Hobbycoder 13. Mai 2020 11:46

AW: Thread Problem?
 
Zitat:

Zitat von zeras (Beitrag 1464410)
Meine Frage war eigentlich, ob sich ein Programm anders verhält, wenn man es einfach so startet oder ob man es in einen Thread packt und dort werkeln läßt. Vielleicht gibt es Threadeinstellungen, die ich nicht kenne.
Mittlerweile habe ich weitere Tests machen können und in dem Python Script, welches im Programm ausgeführt wird, eine Änderung vorgenommen. Offenbar gibt es im Programm Überschneidungen mit Schliessen von Dateien und dem gleichzeitigem Zugriff.

Wie Dalai bereits sagte, spielt es keine Rolle, ob du das Programm direkt aus dem Mainthread oder aus einem anderen Thread heraus startest. Das gestartete Programm läuft immer in seinem eigenen Thread/Prozess. Das einzige was du machen kannst, auf des Ende dieses Prozesses warten. Solltest du allerdings den Prozess aus deinem Mainthreat gestartet haben und auf dessen Ende warten, wird deine GUI nur noch wenig reagieren.

Ansonsten musst du natürlich selber darauf achten, dass du nicht noch irgendwelche Handles auf Datei offen hast.

Und solltest du verschiedene externe Programme oder Pythonscript aus verschiedenen Threads heraus starten, ist das abstimmen des Timings natürlich schwieriger und es kann sehr schnell zu Dateizugriffsproblemen kommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf