Ho cercato di rintracciare una perdita di memoria di JvHidControllerClass.pas
Jedi VCL, che mi sono imbattuto in questo cambiamento nella storia fonte:Delphi: un thread dovrebbe mai essere creato "non sospeso"?
più vecchio di revisione:
constructor TJvHidDeviceReadThread.CtlCreate(const Dev: TJvHidDevice);
begin
inherited Create(True);
Device := Dev;
NumBytesRead := 0;
SetLength(Report, Dev.Caps.InputReportByteLength);
end;
revisione corrente:
constructor TJvHidDeviceReadThread.CtlCreate(const Dev: TJvHidDevice);
begin
inherited Create(False);
Device := Dev;
NumBytesRead := 0;
SetLength(Report, Dev.Caps.InputReportByteLength);
end;
Per esperienza, ho scoperto che se si crea un filo non sospesi:
inherited Create(False);
poi il filo immediatamente inizia a funzionare. In questo caso si tenterà di accedere a un oggetto che non è stato ancora inizializzato:
procedure TJvHidDeviceReadThread.Execute;
begin
while not Terminated do
begin
FillChar(Report[0], Device.Caps.InputReportByteLength, #0);
if Device.ReadFileEx(Report[0], Device.Caps.InputReportByteLength, @DummyReadCompletion) then
subito cercando di riempire Report
, e accedere all'oggetto Device
. Il problema è che non sono ancora stati inizializzati; quelli sono i prossimi righe dopo il thread è iniziato:
Device := Dev;
NumBytesRead := 0;
SetLength(Report, Dev.Caps.InputReportByteLength);
Mi rendo conto che è una condizione di competizione; e le probabilità che un utente subisca un arresto durante la produzione sono piuttosto basse, quindi è probabilmente innocuo abbandonare la corsa.
Ma sono via? Mi sto perdendo qualcosa? Chiama:
BeginThread(nil, 0, @ThreadProc, Pointer(Self), Flags, FThreadID);
non avviare un thread off e in esecuzione subito? Si tratta davvero di una regressione della condizione di competizione che è stata (intenzionalmente) aggiunta a JVCL? C'è qualche segreto su
CreateSuspended(False);
che il corretto codice dirende più di:
CreateSuspended(True);
...
FDataThread.Resume;
?
Dopo essere stato bruciato chiamando erroneamente
TMyThread.Create(False)
ho depositato nel mio cervello come mai corretta. C'è un uso valido per far partire subito un thread (quando devi inizializzare i valori)?
Wow !!! JVCL su D5! anche se è stato spento dopo che l'ho lasciato e ho smesso di mantenere la compatibilità con D5. Un sentimento così nostalgico ... –
@ Arioch'The Non essere troppo nostalgico; è JVCL 3.x del 2009. E in senso stretto è la classe HidController originale di Richard Marquand del 2005; con cui ho aiutato un po ' La versione adottata da JVCL subì un enorme * "jcl-ifying" *; ma non ci sono vere differenze; ma tecnicamente sto usando la versione di Richard; così posso correggere l'arresto * use-after-free * che FastMM cattura. –