AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Ereignis wird nicht zu Ende geführt (früher "... ausgelöst")
Thema durchsuchen
Ansicht
Themen-Optionen

Ereignis wird nicht zu Ende geführt (früher "... ausgelöst")

Ein Thema von Schwedenbitter · begonnen am 13. Nov 2014 · letzter Beitrag vom 14. Nov 2014
Antwort Antwort
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Ereignis wird nicht ausgelöst

  Alt 13. Nov 2014, 23:50
Danke für Eure Antworten!
Das Problem ist jetzt so gelöst:
Delphi-Quellcode:
procedure TForm1.ThreadEnde(ID: Integer);
Var
   I: Integer;
begin
   I:=0;
   while (I < fObjectList.Count) do
   begin
      if (TMyObject(fObjectList[I]).ID = ID) then break;
      Inc(I);
   end;
   if (I < fObjectList.Count) then // Wäre so, wenn ID nicht gefunden würde.
   begin
      TMyObject(fObjectList[I]).PNGStream.SaveToFile('bild.png');
      TMyObject(fObjectList[I]).JPGStream.SaveToFile('bild.jpg');
      Memo1.Lines.Append('... all done - object ID is ' + IntToStr(ID));
   end
   else Memo1.Lines.Append('ERROR: ID ' + IntToStr(ID) + ' not found!');
   Button1.Enabled:=true;
end;
Hintergrund der IDs hatte ich versucht zu erklären. Es kommen so ca. 50 Seiten/min. vom Scanner. Das soll in etwa auch so bleiben. Ich habe daher (neben dem Haupt-Thread der VCL) einen Thread gebaut, der in tpIdle rumdümpelt und nichts anderes tut, als eine Liste mit den Bildcontainern zu verwalten. Er sorgt auch für einen geordneten Ablauf der Kompression, Kontrastanpassung etc. pp.
Die Benutzer können aber - weil Thread - die Bilder schon während des Scannens aussortieren (=löschen). Das bringt dann den Index der Liste durcheinander und da habe ich mir eben über die ID geholfen. Dass es im ursprünglichen Code beim 3. Mal "knallt", war dem Umstand geschuldet, dass ich das TMemoryStream.Save(); als Fehlerquelle ausgemacht hatte und grundsätzlich erstmal sehen wollte, ob die Procedure überhaupt bis zum Ende durchläuft...

Stichwort threadsichere Komponenten. Was versteht man darunter und wie finde ich es raus. Ich dachte, mit CriticalSections zu arbeiten, würde bzgl. Threads schon ausreichend sein. Da der HauptThread die Kommandos für das Packen verwaltet und den Container entsprechend mit einem TAG versieht, sollte also alles im Lot sein.
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.558 Beiträge
 
Delphi 12 Athens
 
#2

AW: Ereignis wird nicht zu Ende geführt (früher "... ausgelöst")

  Alt 14. Nov 2014, 07:38
Weußt du, wie man 79% des Codes einsparen kann?

ThreadEnde bekommt das Objekt und nicht die ID, als Parameter.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Ereignis wird nicht zu Ende geführt (früher "... ausgelöst")

  Alt 14. Nov 2014, 08:26
Weußt du, wie man 79% des Codes einsparen kann?

ThreadEnde bekommt das Objekt und nicht die ID, als Parameter.
Hast Du das durchgerechnet?
Spaß beiseite: Würde es Dir viel ausmachen, mir das vom Grundsatz zu skizzieren?

Ich baue immer noch an dem großen Thread - das hier ist wie gesagt nur ein Ausschnitt - und optimiere den weiter. Das würde ich weiter nach hinten verschieben, wenn Du mir das erklärtest...
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#4

AW: Ereignis wird nicht zu Ende geführt (früher "... ausgelöst")

  Alt 14. Nov 2014, 08:36
Würde es Dir viel ausmachen, mir das vom Grundsatz zu skizzieren?
Na, das ist dich ziemlich ersichtlich. Wenn du als Parameter für ThreadEnde nicht die ID sondern z.B. TheObject: TMyObject deklarierst,

Delphi-Quellcode:
procedure TForm1.ThreadEnde(TheObject: TMyObject);
begin
  Memo1.Lines.Append('Event for ID ' + IntToStr(TheObject.ID) + ' received');
  if TheObject.ID > 2 then
  begin
    TheObject.PNGStream.SaveToFile('bild.png');
    TheObject.JPGStream.SaveToFile('bild.jpg');
  end;
  // Bei ID < 3 läuft alles durch. Es muss also Probleme beim Speichern geben.
  Button1.Enabled:=true;
  Memo1.Lines.Append('... all done - object ID is ' + IntToStr(TheObject.ID));
end;
und dann in FireOnEnde sowas
if assigned(fOnEnde) then fOnEnde(fMyObject);
schreibst, dann kannst du den Zugriff über die Liste sparen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Ereignis wird nicht zu Ende geführt (früher "... ausgelöst")

  Alt 14. Nov 2014, 16:53
...
schreibst, dann kannst du den Zugriff über die Liste sparen.
Danke erstmal für diese ausführlich Erklärung. Ich dachte wirklich, er meint 79% des gesamten Programm-Codes.

Ich muss jetzt doch mal den Code der gesamten Objekte hier einbringen. Konkret geht es um die Zeilen 242/243 bzw. 255/256 in der Unit _PictureStack.pas. Ich habe - auch in der abgespeckten Testversion - nie Probleme gehabt, dem Thread ein Event mit auf den Weg zu geben, über das er sein Ende mitteilen soll.
Hier meckert der Compiler aber rum:
Zitat:
[dcc32 Fehler] _PictureStack.pas(243): E2009 Inkompatible Typen: 'Reguläre Prozedur und Methodenzeiger'
Nachdem ich das ganze jetzt schon zum 3. Mal komplett neu aufgebaut und wieder keinen Fehler im Aufbau gesehen habe, muss ihn ein anderer finden. Auch der Hilfetext ist nicht wirklich hilfreich

Um die Problematik der Rückgabe des ganzen Bild-Container, würde ich mich danach kümmern wollen...
Angehängte Dateien
Dateityp: zip 05.Fork.03.zip (7,4 KB, 1x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.758 Beiträge
 
Delphi 12 Athens
 
#6

AW: Ereignis wird nicht zu Ende geführt (früher "... ausgelöst")

  Alt 14. Nov 2014, 16:58
Auch der Hilfetext ist nicht wirklich hilfreich
Wieso nicht? Die Deklaration von TCalcDone enthält ja nicht den Zusatz of object . Deshalb ist das auch kein Methodenzeiger.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.558 Beiträge
 
Delphi 12 Athens
 
#7

AW: Ereignis wird nicht zu Ende geführt (früher "... ausgelöst")

  Alt 14. Nov 2014, 17:07
Delphi-Quellcode:
type
  // Prozedurzeiger
  x = procedure;

  // Methodenzeiger
  x = procedure of object;

// "reguläre" Prozedur (oder Funktion)
procedure ThreadEnde(TheObject: TMyObject);
begin
end;

// Methode
procedure TForm1.ThreadEnde(TheObject: TMyObject);
begin
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (14. Nov 2014 um 17:11 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz