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:
Modificare List e poicodice:List := LockList;
ma non funzionava, infatti nel codice che ho postato utilizzo direttamente la LockList.codice:finally UnlockList;
è un grosso problema?
Grazie,
Andrea.

Rispondi quotando