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!