Attendere fine procedure in un loop

di il
4 risposte

Attendere fine procedure in un loop

Ciao,

mi trovo nella seguente situazione: All'interno di un Thread, la procedura TThread.Execute (nell'esempio sottostante: main) include delle procedure. In una di queste procedure (nell'esempio: proc1) viene creato un oggetto il quale, a sua volta, include come parametro di tipo System.Pointer una procedure (nell'esempio: proc2).
type
  TWorkerThread = class(TThread)
  private
    var#1;
    ...

Procedure TWorkerThread.Execute; //main
begin
  ...
  for i := 0 to FileCount do
    begin
     procedure proc1;
     WriteLog('step 3');
   end;
end;

Procedure TWorkerThread.proc1;
var
  var#2
begin
  ...
  WriteLog('step 1');
  obj := TObj.Create(nil);
  for n := 0 to PageCount do
    obj.Do(proc2
      begin
        ... (uso di var#1 e var#2)
        WriteLog('step 2');
      end);
end;
Nel log file, invece di trovarmi la seguenza 'step 1' (proc1) - 'step 2' (proc2) - 'step 3' (main), trovo step 1 - 3 - 2.
Presumo che "proc1" risulta finito con l'inizio di "proc2" perché all'interno di "proc2" la variabile "n" del primo loop di "proc1" viene valorizzato con "1" invece di "0".

Per evitare che le variabili condivise utilizzate in "proc2" vengano valorizzate dal successivo loop di "proc1" o "main", è possibile far attendere il ciclo loop di "proc1" la fine del suo processo "proc2", in modo che il loop di "main", a sua volta, non proceda (e che quindi nel file log risulti la seguenza 1 - 2 - 3)?

Oppure esiste un modo migliore di quello sopra descritto per organizzare le procedure/variabili all'interno del Thread per eliminare il problema dei valori errati?

Ale

4 Risposte

  • Re: Attendere fine procedure in un loop

    Ora ho aggiunto delle variabili all'interno di "proc2" per passare i valori delle variabili di "main" e "proc1". Per il momento funziona, ma il raddoppiamento di variabili non mi sembra la via migliore.

    Ale
  • Re: Attendere fine procedure in un loop

    al.delphi ha scritto:


    Per evitare che le variabili condivise utilizzate in "proc2" vengano valorizzate dal successivo loop di "proc1" o "main", è possibile far attendere il ciclo loop di "proc1" la fine del suo processo "proc2", in modo che il loop di "main", a sua volta, non proceda (e che quindi nel file log risulti la seguenza 1 - 2 - 3)?
    Lo dirò sinteticamente: non ci ho capito una mazza.

    Il fatto che siamo all'interno di un thread direi che possiamo ignorarlo, poiché la logica del metodo Execute() si presuppone venga eseguita linearmente (il parallelismo è dato dal fatto che viene appunto creato un thread, quindi il chiamante del thread esegue in parallelo alla logica del thread stesso, ma la logica del thread rimane sequenziale e "bloccante" nel suo contesto).

    Fatta questa premessa, c'è una strana commistione di metodi anonimi che catturano variabili dal tipo non definito e presenti a diversi livelli, all'interno del thread come campi o come variabili locali dentro a queste procedure, senza che alla fine sia chiaro qual è lo scenario, che operazioni svolgono, perché viene fornito il metodo anonimo come parametro, che scopo e di che tipo sono le variabili, ecc. ecc.

    Suggerisco di mettere il codice originale o le parti salienti, o di creare un PoC o spiegare meglio l'esigenza, anche se intravedo già un percorso di probabile "complicazione inutile di cosa semplice", o quantomeno i sentori sono molto forti...

    Ciao!
  • Re: Attendere fine procedure in un loop

    Grazie, Marco, e scusa per la domanda un po' "concettuale". In futuro provo di rimanere sul concreto, lo prometto. : )

    Ho portato il completo codice in una VCL per poter fare il debug. È impegnativo dover gestire in parallelo due codici non esattamente identici, ma almeno riesco a seguire i valori passati e organizzare per bene le variabili.

    Ale
  • Re: Attendere fine procedure in un loop

    al.delphi ha scritto:


    Grazie, Marco, e scusa per la domanda un po' "concettuale". In futuro provo di rimanere sul concreto, lo prometto. : )
    No, in realtà la domanda era abbastanza "pratica", ma proprio per questo l'omissione di certi dettagli impediva di capire fino in fondo.

    al.delphi ha scritto:


    Ho portato il completo codice in una VCL per poter fare il debug. È impegnativo dover gestire in parallelo due codici non esattamente identici, ma almeno riesco a seguire i valori passati e organizzare per bene le variabili.
    Non volevo "ammazzare" la discussione sul nascere o costringere implementazioni superflue, ad ogni modo se si vorrà chiarire, nessun problema a farlo.

    Ciao!
Devi accedere o registrarti per scrivere nel forum
4 risposte