Sto programmando un'app multi-thread. Ho due fili. On è per il trasferimento di alcuni dati dal dispositivo al buffer di dati globali e il secondo è per scrivere quei dati su file.La best practice su come aspettare i dati all'interno del thread e scriverli in un file?
I dati dal dispositivo al buffer si stanno trasferendo in modo asincrono. Lo scopo del secondo thread dovrebbe essere quello di attendere la quantità specificata di dati da scrivere nel buffer dei dati principali e, infine, di scriverli in un file.
Bene, il primo thread è in DLL e il secondo è nell'app principale. Temporaneamente risolvo questo con gli eventi. Il primo thread trasferisce i dati dal dispositivo al buffer dei dati principali e conteggia i dati e quando viene trasferita la quantità specificata di dati imposta un evento. Il secondo attende che l'evento sia segnalato e quando viene eseguito un codice per l'archivio dati. Semplice come quello che sta funzionando.
Thread1.Execute:
var DataCount, TransferedData: Integer;
DataCounter := 0;
while not Terminted do
begin
TransferData(@pData, TransferedData);
Inc(DataCounter, TransferedData)
if DataCounter >= DataCountToNotify then SetEvent(hDataCount);
end;
Thread2.Execute:
hndlArr[0] := hDataCount;
hndlArr[1] := hTerminateEvent;
while (not Terminated) do
begin
wRes := WaitForMultipleObjects(HandlesCount, Addr(hndlArr), false, 60000);
case wRes of
WAIT_OBJECT_0:
begin
Synchronize(WriteBuffer); // call it from main thread
ResetEvent(hndlArr[0]);
end;
WAIT_OBJECT_0 + 1:
begin
ResetEvent(hTerminateEvent);
break;
end;
WAIT_TIMEOUT: Break;
end;
end;
Ora vorrei fare secondo thread più indipendente ... in modo da poter rendere più istanze di secondo thread e non ho bisogno di aspettare per il primo thread. Vorrei spostare i dati contando parte del codice dal primo thread al secondo, quindi non avrò più bisogno del conteggio dei dati nel primo thread. Il primo sarà solo per scopi di trasferimento dati.
Vorrei utilizzare il secondo come contatore di dati e memorizzare i dati. Ma ora dovrò fare un ciclo e controllare continuamente manualmente la quantità di dati specificata. Se avessi il ciclo while dovrò aggiungere un po 'di sonno in modo che il secondo thread non ridurrà le prestazioni del computer, ma non so per quanto tempo dovrebbe dormire mentre la velocità di trasferimento dei dati nel primo thread non è costante e quindi la velocità di conteggio nella seconda discussione varierà.
mia ipotesi che questo esempio di codice non è buono:
Thread2.Execute:
var DataCount: Integer;
DataIdx1 := GetCurrentDataIdx;
while (not Terminated) do
begin
if (GetCurrentDataIdx - DataIdx1) >= DataCountToNotify then
begin
Synchronize(WriteBuffer);
DataIdx1 := GetCurrentIdx;
end;
sleep(???);
end;
Quindi la mia domanda è che cosa è l'approccio migliore per risolvere il problema con il conteggio dei dati e la memorizzazione nel secondo thread? Quali sono le tue esperienze e i tuoi suggerimenti?
Perché imponi la scrittura del file sul thread principale, 'Sincronizza (WriteBuffer)'? Non capisco come riuscirai a moltiplicare il secondo thread e mantenere l'ordine di scrittura in un singolo file. –
Il thread verrà moltiplicato ma i dati verranno archiviati in file diversi. Non ho scritto da nessuna parte che lo scriverò nello stesso file. Il mio obiettivo è avere più controlli che siano in grado di memorizzare i dati dalla stessa fonte in file diversi. – Nix
È bene sapere, poiché la risposta dipenderà da queste informazioni. Mi chiedo ancora perché la scrittura del file debba essere applicata al thread principale. –