Ciao a tutti,
questo il mio problema.
ho creato, utilizzando graphics32, un piccolo "motore grafico" che utilizzo all'interno di un filtro directX. Tra i componenti di questo motore ci sono delle animazioni, che non sono altro che delle sequence di file anim000.tga ... anim100.tga.
il componente animazione utilizza un thread al suo interno per la lettura e l'eventuale elaborazione dei file.
Se io carico più animazioni dello stesso tipo in un progetto ho il problema che le varie animazioni, con i relativi threads, cercando di caricare nello stesso momento i file dal disco sollevano un'eccezione, essendo il "file utilizzato da un altro processo".
Domanda 1, come è possibile evitare ciò?
Proseguo...
per evitare di dover caricare più volte lo stesso file dal disco ho creato una classe che memorizza i file caricati in precedenza e se vengono richiesti li fornisce lei invcece di ricorrere all'HD...
codice:
PLoadedFile=^TLoadedFile;
TLoadedFile=record
Path : string;
FileStream : TMemoryStream;
Compressed : Boolean;
end;
PFileList = ^TFileList;
TFileList = class(TThreadList)
private
FB : TBitmap32;
procedure AddFile(APath: string);
public
constructor Create;
destructor Destroy; override;
procedure DeleteAll;
function LoadFile(APath: string): TStream;
end;
function TFileList.LoadFile(APath: string): TStream;
var LF : PLoadedFile;
i : integer;
found: boolean;
// List: TList;
begin
found := false;
// List := LockList;
try
if LockList.Count > 0 then
for i := 0 to LockList.Count - 1 do
begin
LF := LockList.Items[i];
if LF.Path = APath then
begin
Result := LF.FileStream;
Result.Position := 0;
found := true;
Break;
end;
end;
if not found then
begin
AddFile(APath);
LF := LockList.Items[LockList.Count-1];
Result := LF.FileStream;
Result.Position := 0;
end;
finally
UnlockList;
end;
end;
La cosa funziona solo per la prima animazione, le altre non caricano i file
e immagino sia perché quando l'animazione 1 carica i file blocca la lista
che le diventa inaccessibile agli altri.
Qual'è la soluzione migliore per risolvere il problema? usare un evento e un wait
sui thread di lettura o cosa?
spero di essere stato chiaro... sennò chiedete pure.
Grazie mille!
P.S: da quello che ho letto in giro, quando si legge da una TThread list bisognerebbe usare:
codice:
List := LockList;
Modificare List e poi
codice:
finally UnlockList;
ma non funzionava, infatti nel codice che ho postato utilizzo direttamente la LockList.
è un grosso problema?
Grazie,
Andrea.