AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TThread und TObjectList

Ein Thema von borncrush · begonnen am 10. Feb 2008 · letzter Beitrag vom 11. Feb 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von borncrush
borncrush

Registriert seit: 18. Dez 2005
Ort: Berlin
115 Beiträge
 
Delphi XE7 Enterprise
 
#1

TThread und TObjectList

  Alt 10. Feb 2008, 23:18
Hallo,

ich habe ein Problem, welches auch nach langer Recherche im Internet nicht geklärt werden konnte, dass mich zu schaffen macht.

Ich habe folgenden Thread (komplette Unit):
Delphi-Quellcode:
unit uTCalendarThread;

interface

uses
  Classes,Contnrs,StrUtils;

type
  TCDate=class(TObject)
  public
    sCaption:String;
    sStartTime:TDateTime;
    sEndTime:TDateTime;
  end;

  TCalendarThread = class(TThread)
  private

  protected
    procedure Execute; override;
  public
    CDateList:TObjectList;
    constructor Create;
    destructor Destroy;
  end;

implementation

uses SysUtils;

{ TCalendarThread }

constructor TCalendarThread.Create;
begin
  self.CDateList:=TObjectList.Create; //### #Problemstelle# ###
  inherited Create(False);
end;

destructor TCalendarThread.Destroy;
begin
  FreeAndNil(Self.CDateList);
end;

procedure TCalendarThread.Execute;
var s:TCDate;
begin
  while not Terminated do begin
    s:=TCDate.Create; //testobjekt hinzufügen
    CDateList.Clear;
    CDateList.Add(s);
  end;
end;


end.
Beim Erstellen und Starten des Thread (TCalendarThread) erhalte ich eine "Access Violation"-Meldung, solange es ein Programm mit MDI-Form ist.

Aufruf innerhalb der MDI-Form:
Delphi-Quellcode:
var TThTest:TCalendarThread;

[...]

procedure TfrmMain.FormCreate(Sender: TObject);
[...]
   TThTest:=TCalendarThread.Create(false);//Instanz erzeugen und Thread starten
[...]
Sobald ich ein Delphi-Projekt ohne MDI-Fenster erstelle/benutze, funktioniert es tadellos.
Diesen Unterschied konnte ich sicher feststellen, jedoch verstehe ich den Hintergrund nicht bzw. kann keine Lösung entwickeln. Wobei mir das Zweite wichtiger ist.

Ich hoffe, dass jemand mir weiterhelfen kann.
  Mit Zitat antworten Zitat
Thorben_Ko

Registriert seit: 8. Jun 2007
86 Beiträge
 
#2

Re: TThread und TObjectList

  Alt 10. Feb 2008, 23:36
SOllte an sich einfach zu beheben sein:

Delphi-Quellcode:
constructor TCalendarThread.Create;
begin
  self.CDateList:=TObjectList.Create; //### #Problemstelle# ###
  inherited Create(False);
end;
Ich vermute mal das es daran liegt das du einer Variblen einen Wert zuweisst., welche aber noch keinen Speicher im Arbeitsspeicher reserviert bekommen hat

Delphi-Quellcode:
constructor TCalendarThread.Create;
begin
   inherited Create(False); // erst Create, bevor du was zuweisst
  self.CDateList:=TObjectList.Create; //### #Problemstelle# ###

end;
Vll hillft das schon

Gruss Thorben
  Mit Zitat antworten Zitat
Benutzerbild von borncrush
borncrush

Registriert seit: 18. Dez 2005
Ort: Berlin
115 Beiträge
 
Delphi XE7 Enterprise
 
#3

Re: TThread und TObjectList

  Alt 11. Feb 2008, 08:02
Guten Morgen,
danke erstmal für die Antwort.

Nochmals möchte anmerken, dass die Thread-Unit problemlos arbeitet, sobald keine MDI-Form im Delphi-Projekt vorhanden ist bzw das Hauptfenster darstellt.

Trotz alledem habe ich deinen Vorschlag ausprobiert und leider erhalte ich immernoch eine "Access Violation"-Meldung.

Da ich im Internet auch einfach nichts finden konnte, hoffe ich mal nicht, dass das Problem
unlösbar ist.


Gruß
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: TThread und TObjectList

  Alt 11. Feb 2008, 08:13
Du musst den Thread im 'suspended' Modus starten, sonst springt er nach dem Create u.U. gleich in die Execute-Methode.

Delphi-Quellcode:
Constructor TMyThread.Create;
Begin
  Inherited Create (True); // stay asleep
  fLocalStuff := TLocalStuff.Create; // create local stuff
  Resume; // go!
End;
Dein Problem liegt vermutlich woanders, denn mit der Threadgeschichte ist alles ok. Auch wenn dein Create funktioniert, würde ich es trotzdem noch so wie von mir vorgeschlagen abändern, einfach weil es schöner ist.

Es ist zwar unschön, aber Du kannst spaßeshalber deine Liste auch in der Execute-Methode instantiieren, da dieser code im Thread läuft, das CREATE aber noch nicht.

Wo genau tritt der Fehler denn auf? Im Threadkonstruktor, oder der Execute-Methode? Greifst Du von außen auf die Liste zu? Wenn ja, wie?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von borncrush
borncrush

Registriert seit: 18. Dez 2005
Ort: Berlin
115 Beiträge
 
Delphi XE7 Enterprise
 
#5

Re: TThread und TObjectList

  Alt 11. Feb 2008, 08:24
Der Vorschlag klingt sehr plausibel; hatte aus diesem Grund auch mal die Problemzeile (TObjectList.Create) in die Execute-Methode gepackt, um den zu frühen Zugriff der Execute-Methode zu verhindern, welches jedoch auch keine Besserung ergab.
Mein Konstrukt sah dann so aus:
Delphi-Quellcode:
constructor TCalendarThread.Create;
begin
  inherited Create(True);
  Resume; //### #<---nun kracht es hier # ###
end;
[...]
procedure TCalendarThread.Execute;
var s:TCDate;
begin
  self.CDateList:=TObjectList.Create; //### #Problemstelle# ###
  while not Terminated do begin
    s:=TCDate.Create; //testobjekt hinzufügen
    CDateList.Clear;
    CDateList.Add(s);
  end;
end;
Wie gesagt, ohne MDI-Form keine Probleme, mit jedoch schon.




Nun probierte ich natürlich auch gezielt deine Methode aus,
Delphi-Quellcode:
constructor TCalendarThread.Create;
begin
  inherited Create(True);
  self.CDateList:=TObjectList.Create; //### #Problemstelle# ###
  Resume;
end;
jedoch knallt es immernoch bei der markierten Stelle.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: TThread und TObjectList

  Alt 11. Feb 2008, 08:32
Dann liegt der Fehler nicht in dem Thread-Code.


P.S.: MDI ist doch eh veraltet...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#7

Re: TThread und TObjectList

  Alt 11. Feb 2008, 10:02
Ich hab' es mal nachgebaut. Bei mir funktioniert Dein Beispiel einwandfrei, sowohl beim Aufruf vom Mainform als auch beim Aufruf vom MDI-Child. Ich habe beide Forms automatisch erstellen lassen.

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von borncrush
borncrush

Registriert seit: 18. Dez 2005
Ort: Berlin
115 Beiträge
 
Delphi XE7 Enterprise
 
#8

Re: TThread und TObjectList

  Alt 11. Feb 2008, 18:47
Ich konnte ebenfalls im Internet einen Delphi-"Progger" finden, der ebenfalls die selben Probleme hat, eine Lösung wurde jedoch nicht gefunden.

@alzaimar
Das der Thread-Code nicht falsch war, konnte ich mir schon denken, da es ja auch ohne MDI läuft. Trotzdem danke für Hilfeversuche.
Da wir schon mal gleich dabei sind, welche Alternative kann ich denn nutzen (im Bezug auf MDI)? Sprich ein Hauptfenster, indem die "Child"-Fenster gefangen sind, um die Übersichtlichkeit zuhalten. Habe noch noch im Internet recherchiert.

@messie
Ich denke mal es wird irgendeine Komponente sein, denn das Programm ist eine Art Warenwirtschaftssystem (Auftragsbearbeitung) in klein, dadurch ist es schon sehr komplex und deshalb kann ich nicht sukzessive Code auskommentieren, um den Fehler zu finden. Trotzdem Danke!


Wäre natürlich trotzdem sehr angenehm, wenn noch jemand eine Lösungsansatz hätte .

Bis dahin, angenehme Zeit

Viele Grüße
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#9

Re: TThread und TObjectList

  Alt 11. Feb 2008, 19:24
Ich würde trotzdem nochmal nachschauen, ob der Speicher beim Erzeugen des Thread schon da ist.var TThTest:TCalendarThread; Deklarier' das mal global an einer Stelle, die wirklich sicher erzeugt wird, z.B. in der Unit uTCalendarThread oder im HauptThread/MDI-parent. Murphy's Orakel sagt, dass da irgendwo eine ganz banale Kleinigkeit bei der Speicherzuweisung klemmt. .
Hast Du Deinen Fehler mal mit MadExceptions genauer untersucht?

Grüße, Messie
  Mit Zitat antworten Zitat
Benutzerbild von borncrush
borncrush

Registriert seit: 18. Dez 2005
Ort: Berlin
115 Beiträge
 
Delphi XE7 Enterprise
 
#10

Re: TThread und TObjectList

  Alt 11. Feb 2008, 19:52
Ja, Messie, bin ganz deiner Meinung. Ist sicherlich ganz banal das Problem, aber erstmal finden =).

Mit MadExceptions konnte ich noch keine Erfahrungen sammeln, sprich nach deinem Post war es die erste Verwendung.
Dadurch kann ich aber leider auch nichts erkennen, im Anhang mal ein Bildschirmausschnitt.

//edit:
Hab die Deklaration mal sicher abgelegt, Fehler bleibt aber der gleiche.(edit2: Fehler bleibt nicht der gleiche, s. nächster Beitrag )
Miniaturansicht angehängter Grafiken
errormessage_493.png  
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 18:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz