Einzelnen Beitrag anzeigen

Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Server mit Liste aus Records crasht

  Alt 26. Sep 2008, 00:59
mh das break; habe ich geschickt überlesen....

Sehe ich das richtig, dass "Main" nicht innerhalb des Threads deklariert wurde, sondern außerhalb im MainThread?

Dann würde ich 2 Sachen vorschlagen (Bin nicht sooo der Thread-Profi, aber ein Versuch ist es ja mal Wert):

Übergib Main dem Threads über den Pointer-Parameter und greife dann darauf zu. Also ungefähr so:

Delphi-Quellcode:
// Kenn die Parameter nicht auswendig. Ich begrenze es mal auf
// 1. Pointer zur Threadfunktion
// 2. Parameter (p)

BeginThread(@Thread,Main);

function Thread(p: Pointer): Integer;
var i: Integer;
    ThreadMain: TMain; //Ka was fürn Typ Main hat.
begin
  if TObject(p) is TMain then
    ThreadMain := TMain(p)
  else
    exit;

  while (1=1) do begin
    if ThreadMain.List.Count >= 1 then begin
      // ...
    end;
      // ...
  end;
end;
Wenn du nicht auf die VCL verzichtest, könntest du es auch mal mit einer Ableitung von TThread probieren und deine ganzen Aufrufe mit Synchronize synchronisieren.


Edit Nr. 12+13 (?!): Habe gemerkt, dass folgender Abschnitt eine ganze Menge Unsinn enthält. Da ich allerdings müde bin (2:52 Uhr) und ich nicht nochmehr Mist erzählen will, werde ich das evtl morgen berichtigen.


Was anderes: Du könntest eine Klasse von TList ableiten, die sich selbst um die Freigabe der Daten hinter einem Pointer kümmert:

Delphi-Quellcode:
interface

type
  TListEx = class(TList)
  protected
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  end;

implementation

{ TListEx }

procedure TListEx.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if Action = lnDeleted then
    Dispose(Ptr);
end;
Dann würde ein:

Main.List.Delete(i); reichen (Ist allerdings (noch) ungetestet)

Edit:
Also funktionieren tut es, aber ich habe gemerkt, dass man, wenn man keine Memory-Leaks verursachen will, die Strings im Record manuell freigeben muss. D.h. SetLength(Str,0) oder Str := ''; So ist es zumindest bei meinem Test-Record gewesen.
Dieses Problem verschwindet allerdings, wenn man PChars statt Strings benutzt. Die PChars muss man auch nicht manuell freigeben. (Außer, man reserviert für sie manuell Speicher, was man aber meistens nicht tut (WinAPIs ausgenommen))

Und weil ich so gerne editiere, fasse ich mal meine Aussagen zusammen^^:

Main über den p-Parameter der Threadfunktion übergeben
Ggf. VCL-Threads benutzen und Synchronize benutzen
Meine TListEx benutzen
In dem Record PChars statt Strings benutzen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat