Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - keine Rückmeldung wegen zu langer Laufzeit
Barret - Di 28.02.12 16:05
Titel: keine Rückmeldung wegen zu langer Laufzeit
Hi!
Ich bekomme bei ner Funktion (Verkettung von x Funktionen) nach Zeit X immer die Anzeige "keine Rückmeldung". Das Programm erstellt XML-Files die ca. 30.000 Zeilen haben. Da aber so viele Sachen abgefragt werden bei der Erstellung ist das halt nicht in 5 Sekunden geschehen. Das Programm an sich arbeitet noch im Hintergrund nur in der Oberfläche sagt er "keine Rückmeldung".
Hat jemand eine Ahnung wie ich ein Signal geben kann welches sagt: "Alles io ich arbeite noch!" Und am Besten ohnen nen Timer der irgendwas mit sleep macht...
Ich hab schon überlegt was mit Threads zu machen. Habe aber kein richtiges Tut gefunden mit dem ich was anfangen konnte & eigentlich wird ja auch nur eine Funktion ausgeführt und nicht X Stück zur gleichen Zeit.
Für gute Ansätze wär ich dankbar!
Nersgatt - Di 28.02.12 16:08
Threads sind eigentlich die richtige Methode. Lass die Arbeit in einem extra Thread ablaufen und auf der Programmoberfläche kannst Du dann den Fortschritt anzeigen oder eine Möglichkeit, den Vorgang (also den Thread) abzubrechen.
Die schmutzige Methode ist, hier und da ein Application.ProcessMessages einzustreuen. Wie gesagt - schmutzig, bäh :D
Tastaro - Di 28.02.12 16:10
Application.ProcessMessages mag schmutzig sein, sollte hier den Zweck aber voll erfüllen. :)
Beste Grüße
Barret - Di 28.02.12 17:51
EDIT: Jetzt geht es! Ich hatte das Free des Threads an der falschen Stelle! (schön demlich!)
Eine Frage hab ich dann doch noch: Reciht das "Free" im finally aus? Oder muss ich den Thread noch anderweitig beenden?
Anlegen:
Delphi-Quelltext
1: 2: 3: 4: 5:
| type TExportThread = class(TThread) protected procedure Execute; override; end; |
Angabe was der Thread machen soll:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TExportThread.Execute; begin try pro_app_xml_export; finally Free; end; end; |
Thread Erstellen und Ausführen (ist unter
var in der procedure auch angelegt)
Delphi-Quelltext
1:
| thread_export := TExportThread.Create(false); |
jaenicke - Di 28.02.12 18:27
In der Klasse sich selbst freigeben ist auch mehr als gewagt. Wenn, dann gibt es FreeOnTerminate, das du im Konstruktor des Threads setzen kannst. ;-)
Nersgatt - Mi 29.02.12 09:33
Barret hat folgendes geschrieben : |
Thread Erstellen und Ausführen (ist unter var in der procedure auch angelegt)
Delphi-Quelltext 1:
| thread_export := TExportThread.Create(false); | |
Dabei bitte beachten, dass Du auf die Variable thread_export nach dem Starten des Threads nicht mehr zugreifen darfst, weil Du nicht weißt, ob die Instanz schon freigegeben ist, oder nicht.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!