Einzelnen Beitrag anzeigen

Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

Via property auf Array zugreifen (Threadsicher?)

  Alt 25. Feb 2008, 08:55
Hallo,

nachdem ich große Hilfestellung bekommen habe, habe ich mir den mir genannten Vorschlag zu Herzen genommen, mich eingelesen und an meine Bedürfnisse weiter angepasst. Nun würde ich gerne wissen, ob das was ich gemacht habe, auch wirklich Threadsafe ist und wie ich das testen kann.

Was das Programm macht:

Das Hauptprogramm ruft eine DLL-Form auf, die per Windows.SetParent in die Hauptanwendung eingebunden wird. Danach läd die DLL-Form über eine Thread-Unit Daten, die im Thread bearbeitet werden. Die DLL-Form hat ein Container-Objekt erstellt und bei Treaderstellung an den Thread mit weitergegeben. Die Resultate der Bearbeiteten Daten werden in einem Array in der Container-Klasse gespeichert. Nach Beendigung sendet der Thread eine Message an das Hauptprogramm, welches die Daten aus dem ContainerArray ausliest und das Objekt wieder freigibt, wenn es nix mehr zu tun geben sollte.

Hier mal die entscheidenen Quelltexte:

Container:

Delphi-Quellcode:
type
  TExpData = Array of String;
type
  TContainer=class(TSimpleRWSync)
  private
    FExpData: TExpData;
    
    function getExpData(i: Integer): String;
    procedure setExpData(i: Integer; const Value: String);
    function getExpDataCount: Integer;
  public
    property ExpData[i: Integer]: String read getExpData write setExpData;
    property ExpDataCount: Integer read getExpDataCount;
  end;

function TContainer.getExpData(i: Integer): String;
begin
  BeginRead;
  result:=FExpData[i];
  EndRead;
end;

//Bei folgender Prozedur muss ich die Variable "i" haben, da sonst bei der property die Fehlermeldung "Inkompatible Typen" auftritt.
//Aber ich möchte das Array doch immer nur erhöhen.

procedure TContainer.setExpData(i: Integer; const Value: String);
begin
  BeginWrite;
  SetLength(FExpData, Succ(Length(FExpData)));
  FExpData[High(FExpData)]:=Value; <- Warum muss ich einen Index haben?
  EndWrite;
end;
Thread:

Execute ruft Methode zur Speicherung der Daten in ein Array auf. Das Array ist notwendig. Am Ende wird eine Message an die Hauptanwendung DLL-Form gesendet:

  SendMessage(FHndl, WM_CALLBACK, cb_id, LongInt(PChar(s))); Somit weis die Form, dass alle Daten da sind und sie damit arbeiten kann.

Alle Methoden etc. arbeiten miteinander, funktionieren und die richten Daten kommen richtig dort an, wo sie ankommen sollen, doch meine Frage ist nun - da das noch relativ neu für mich war - ob das Threadsafe ist und wie ich das testen kann.

Wäre nett, wenn ihr mal drüberschauen könntent. (Achso, und ich habe im Quelltext noch eine Frage zur Indexvariablen. Vielleicht könnt ihr mir da noch einen Tipp geben.

Danke im Voraus!
  Mit Zitat antworten Zitat