Autor Beitrag
Barret
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 156
Erhaltene Danke: 1

Win XP
D7 Ent
BeitragVerfasst: Di 28.02.12 15:05 
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!

_________________
Wir könnten ja, wenn wir wollten aber wir wollen ja nicht.
It´s not a bug, it´s a feature.
Nersgatt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Di 28.02.12 15: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

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Tastaro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 414
Erhaltene Danke: 23



BeitragVerfasst: Di 28.02.12 15:10 
Application.ProcessMessages mag schmutzig sein, sollte hier den Zweck aber voll erfüllen. :)

Beste Grüße
Barret Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 156
Erhaltene Danke: 1

Win XP
D7 Ent
BeitragVerfasst: Di 28.02.12 16: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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
  type
    TExportThread = class(TThread)
      protected
        procedure Execute; override;
    end;


Angabe was der Thread machen soll:
ausblenden 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)
ausblenden Delphi-Quelltext
1:
thread_export := TExportThread.Create(false);					

_________________
Wir könnten ja, wenn wir wollten aber wir wollen ja nicht.
It´s not a bug, it´s a feature.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19337
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 28.02.12 17: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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Mi 29.02.12 08:33 
user profile iconBarret hat folgendes geschrieben Zum zitierten Posting springen:

Thread Erstellen und Ausführen (ist unter var in der procedure auch angelegt)
ausblenden 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)