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

user profile iconBarret hat folgendes geschrieben Zum zitierten Posting springen:

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.