procedure TMyThread.Execute;
var NomeFileDest:String;
Idx:Integer;
begin
for Idx:=1 to 5 do begin
Application.ProcessMessages;
Sleep(1000);
end;
Synchronize(@EmettiNomeFile);
//Forzo la chiusura del Thread. Per qualche motivo, senza questa istruzione,
//il thread sembrava sempre in esecuzione
Terminate;
end;
Come mai hai detto al thread di siucidarsi al termine?
//estratto dal file classes.inc riga 78
function ThreadProc(ThreadObjPtr: Pointer): PtrInt;
var
FreeThread: Boolean;
Thread: TThread absolute ThreadObjPtr;
begin
{ if Suspend checks FSuspended before doing anything, make sure it }
{ knows we're currently not suspended (this flag may have been set }
{ to true if CreateSuspended was true) }
// Thread.FSuspended:=false;
// wait until AfterConstruction has been called, so we cannot
// free ourselves before TThread.Create has finished
// (since that one may check our VTM in case of $R+, and
// will call the AfterConstruction method in all cases)
// Thread.Suspend;
try
{ The thread may be already terminated at this point, e.g. if it was intially
suspended, or if it wasn't ever scheduled for execution for whatever reason.
So bypass user code if terminated. }
if not Thread.Terminated then
Thread.Execute;
except
Thread.FFatalException := TObject(AcquireExceptionObject);
end;
FreeThread := Thread.FFreeOnTerminate;
Result := Thread.FReturnValue;
Thread.FFinished := True;
Thread.DoTerminate;
if FreeThread then
Thread.Free;
EndThread(Result);
end;
//Riga 49
procedure TThread.DoTerminate;
begin
if Assigned(FOnTerminate) then
Synchronize(@CallOnTerminate);
end;
Ma sono l'unico che si mette a guardare il codice delle librerie? Sono così smanettone? :(
P.S. Qualcuno sa dirmi come valutare come impostare il n° massimo di thread contemporanei? Ho provato con 20 ed il PC sembra reggere, ma siccome il programma dovrà girare anche su altri PC più o meno potenti, volevo evitare di sovradimensionare tale numero.
Ti allego un pool scritto di fretta e furia.
Ti posso solo garantire che compila. L'idea è deleare a lui il fatto di gestire i thread.
Ho scoperto con mio sommo disappunto che la properties Terminated è stata nascosta ... il pool introduce una classe Thread che assomiglia vagamente a quella Java.
Lo start e lo stop sono delegati al monitor ;)
Prova a buttarci un occhio, per farti un'idea :D
Ciao a tutti,
vorrei riproporre la domanda qui sopra citata ... c'è una qualche regola da seguire quando si fanno girare più thread contemporaneamente, per stabilirne il numero massimo? Qualcosa in base alla memoria, al n° di core o altro?
Grazie in anticipo, Mario
N° di processi in parallelo: 1 - Tempo impiegato: 04 Minuti, 58 Secondi, 524 Millesimi
N° di processi in parallelo: 1 - Tempo impiegato: 04 Minuti, 58 Secondi, 232 Millesimi
N° di processi in parallelo: 1 - Tempo impiegato: 04 Minuti, 57 Secondi, 116 Millesimi
N° di processi in parallelo: 1 - Tempo impiegato: 04 Minuti, 57 Secondi, 524 Millesimi
N° di processi in parallelo: 1 - Tempo impiegato: 04 Minuti, 57 Secondi, 826 Millesimi
N° di processi in parallelo: 2 - Tempo impiegato: 02 Minuti, 36 Secondi, 312 Millesimi
N° di processi in parallelo: 2 - Tempo impiegato: 02 Minuti, 36 Secondi, 578 Millesimi
N° di processi in parallelo: 2 - Tempo impiegato: 02 Minuti, 36 Secondi, 798 Millesimi
N° di processi in parallelo: 2 - Tempo impiegato: 02 Minuti, 36 Secondi, 596 Millesimi
N° di processi in parallelo: 2 - Tempo impiegato: 02 Minuti, 37 Secondi, 401 Millesimi
N° di processi in parallelo: 3 - Tempo impiegato: 02 Minuti, 20 Secondi, 980 Millesimi
N° di processi in parallelo: 3 - Tempo impiegato: 02 Minuti, 17 Secondi, 397 Millesimi
N° di processi in parallelo: 3 - Tempo impiegato: 02 Minuti, 17 Secondi, 180 Millesimi
N° di processi in parallelo: 3 - Tempo impiegato: 02 Minuti, 18 Secondi, 647 Millesimi
N° di processi in parallelo: 3 - Tempo impiegato: 02 Minuti, 19 Secondi, 700 Millesimi
N° di processi in parallelo: 4 - Tempo impiegato: 02 Minuti, 03 Secondi, 885 Millesimi
N° di processi in parallelo: 4 - Tempo impiegato: 02 Minuti, 05 Secondi, 175 Millesimi
N° di processi in parallelo: 4 - Tempo impiegato: 02 Minuti, 04 Secondi, 278 Millesimi
N° di processi in parallelo: 4 - Tempo impiegato: 02 Minuti, 04 Secondi
N° di processi in parallelo: 4 - Tempo impiegato: 02 Minuti, 04 Secondi, 119 Millesimi
N° di processi in parallelo: 5 - Tempo impiegato: 02 Minuti, 03 Secondi, 859 Millesimi
N° di processi in parallelo: 5 - Tempo impiegato: 02 Minuti, 03 Secondi, 208 Millesimi
N° di processi in parallelo: 5 - Tempo impiegato: 02 Minuti, 04 Secondi, 753 Millesimi
N° di processi in parallelo: 5 - Tempo impiegato: 02 Minuti, 04 Secondi, 946 Millesimi
N° di processi in parallelo: 5 - Tempo impiegato: 02 Minuti, 02 Secondi, 560 Millesimi
N° di processi in parallelo: 6 - Tempo impiegato: 02 Minuti, 03 Secondi, 999 Millesimi
N° di processi in parallelo: 6 - Tempo impiegato: 02 Minuti, 04 Secondi, 768 Millesimi
N° di processi in parallelo: 6 - Tempo impiegato: 02 Minuti, 03 Secondi, 663 Millesimi
N° di processi in parallelo: 6 - Tempo impiegato: 02 Minuti, 04 Secondi, 220 Millesimi
N° di processi in parallelo: 6 - Tempo impiegato: 02 Minuti, 05 Secondi, 486 Millesimi
N° di processi in parallelo: 7 - Tempo impiegato: 02 Minuti, 02 Secondi, 739 Millesimi
N° di processi in parallelo: 7 - Tempo impiegato: 02 Minuti, 03 Secondi, 209 Millesimi
N° di processi in parallelo: 7 - Tempo impiegato: 02 Minuti, 02 Secondi, 989 Millesimi
N° di processi in parallelo: 7 - Tempo impiegato: 02 Minuti, 02 Secondi, 726 Millesimi
N° di processi in parallelo: 7 - Tempo impiegato: 02 Minuti, 03 Secondi, 070 Millesimi
N° di processi in parallelo: 8 - Tempo impiegato: 02 Minuti, 04 Secondi, 747 Millesimi
N° di processi in parallelo: 8 - Tempo impiegato: 02 Minuti, 05 Secondi, 210 Millesimi
N° di processi in parallelo: 8 - Tempo impiegato: 02 Minuti, 04 Secondi, 562 Millesimi
N° di processi in parallelo: 8 - Tempo impiegato: 02 Minuti, 04 Secondi, 128 Millesimi
N° di processi in parallelo: 8 - Tempo impiegato: 02 Minuti, 04 Secondi, 374 Millesimi
procedure TMyThread.ThreadAggiungiLog(WrkTestoLog: String);
begin
TestoLog:=WrkTestoLog;
Synchronize(@SincronizzaLog);
end;
procedure TMyThread.SincronizzaLog;
begin
if VFPrimo then begin
VFPrimo:=False;
Form1.AggiungiLog('');
Form1.AggiungiLog(' ' + 'Verificare il sorgente ' + ParmNomeFileNew);
end;
Form1.AggiungiLog(TestoLog);
end;