NAbend,
Ich zermatter mir mal wieder den Kopf mit dne Threads.
Folgendes:
Ich habe eine TThread list, in dieser liste wird eine anzahl von X bildern vorgebuffered, und wnen benötigt ausgelesen.
Der Hauptthread will einfach nur die benötigten bilder auslesen. Der Thread der sich um den Buffer kümmert, guckt immer bei welchem bild der Hauptthread gerade ist, und wnen die distanz zum bifferende zu klein wird, werden wieder x bilder nachgeladen.
Das problem ist, das zwar alle bilder reingeladen, aber nicht mehr ausgelesen werden können, es gibt keine fehlermeldung, nur nen leeres Layered Window. Zu allem überfluss scheint es nichtmal möglich abzufragen, ob die Liste noch gelockt ist.
Kann mir jemand helfen? Ich habe Threads noch NIE wirklich hinbekommen, wne ein Thread schreibt und der andere ausließt.
Code:
procedure TMemoryManager.Execute;
var
i: Integer;
LPContainer: TPicContainer;
LBitmap: TBitmap;
LList: TList;
begin
inherited;
Self.FPos := 0;
GPicList := TThreadList.Create;
GPicList.Duplicates := dupAccept;
GLock := False;
LLIst := GPicList.LockList;
for i := 0 to 5478 - 1 do
begin
LPContainer := TPicContainer.Create;
LPContainer.FBitmap := TBitmap.Create;
LList.Add(LPContainer);
end;
GPicList.UnlockList;
while( not Self.Terminated) do
begin
if(Self.FPos - GAnimPos < 5)then
begin
for i := 0 to 50 - 1 do
begin
LList := GPicList.LockList;
try
LPContainer := TPicContainer(LList.Items[Self.FPos]);
LPContainer.FBitmap.SetSize(Screen.Width, Screen.Height);
LoadIdToImage(Self.FPos, LPContainer.FBitmap);
Self.FPos := Self.FPos + 1;
finally
GPicLIst.UnlockList;
end;
end;
end
else
begin
sleep(20);
end;
end;
end;
un die bild funktion:
Code:
procedure LoadFastIdToImage(AId: Integer; ABitmap: TBitmap);
var
LList: TLIst;
begin
LList := GPicList.LockList;
try
ABitmap.Assign(TPicContainer(LList.Items[AId]).FBitmap);
finally
GPicList.UnlockList;
end;
end;