Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [Delphi] Aggiornamento variabili

    Salve ho un problema:

    Dato il seguente "Main" devo aggiornare il valore della variabile "Vret" in base all'esito dei thread

    begin
    Vret := 1; //default error
    NumTerminale:=ReaderIndex; //Alberto 13/04/04: numero di terminale salvato;
    case NumTerminale of
    1: threa1.Create(false);
    2: threa2.Create(false);
    3: threa3.Create(false);
    4: threa4.Create(false);
    5: threa5.Create(false);
    end;
    result:=Vret; //Alberto 13/04/04: Esito funzione
    end.

    In pratica ogni volta che avvio un thread l'esecuzione del programma continua ed in "Vret" non ho mai il valore aggiornato dall'esito di un singolo thread.

    E' possibile aspettare che un thread finisca per aggiornare il valore della variaible "Vret" in base all'esito del thread? E' utilizzabile la condizione Waitfor? Se si non riesco a capire come si usa è possibile avere un'illuminazione?

    Grazie a tutti quelli che potranno essermi d'aiuto.
    Tonino_forma

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466

    Re: [Delphi] Aggiornamento variabili

    Originariamente inviato da tonino_forma78
    In pratica ogni volta che avvio un thread l'esecuzione del programma continua ed in "Vret" non ho mai il valore aggiornato dall'esito di un singolo thread.
    E' normale. Un thread è uno strumento appositamente progettato per eseguire codice in modo asincrono rispetto al codice del programma principale.

    Ciascun thread del programma rappresenta un contesto in cui le istruzioni vengono eseguite "contemporaneamente" (virtualmente è così, questa è la parvenza ma nella pratica non avviene poichè la CPU è in grado di eseguire solo un'istruzione alla volta).
    Generalmente, un'applicazione Delphi possiede un thread primario, che è quello che si occupa di ricevere e gestire i messaggi che danno luogo in seguito alla generazione degli eventi; a questo si possono affiancare più thread che eseguono in modo separato dal thread primario, sfruttando la classe TThread che incapsula tutte le chiamate alle API Win32 per la creazione, esecuzione e terminazione del thread.

    Detto questo, è ovvio che il programma principale continui dopo la creazione di ogni thread, poichè le istruzioni che ne fanno parte vengono eseguite "assieme" al programma principale, che prosegue nella creazione del thread successivo.

    Originariamente inviato da tonino_forma78
    E' possibile aspettare che un thread finisca per aggiornare il valore della variaible "Vret" in base all'esito del thread? E' utilizzabile la condizione Waitfor?
    Il metodo WaitFor permette di bloccare l'esecuzione in attesa che il thread termini. A questo punto però, non vi è alcuna utilità dei thread nel tuo programma; non ha senso creare routine di codice che eseguono separatamente se poi attendi che ognuna di queste abbia terminato il suo lavoro: tanto vale inserire il codice in semplici procedure separate e chiamarle singolarmente, magari usando un valore di ritorno che indichi il successo delle operazioni da effettuare per aggiornare poi il valore di Vret e proseguire solo se il processo è andato a buon fine.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Purtroppo non posso fare a meno dei thread perchè ognuno di questi utilizza un semaforo per accedere ad una risorsa che può essere usata in maniera univoca (in pratica accedo alla porta seriale).

    Stavo valutando l'utilizzo dell'evento OnTerminate per aggiornare "Vret" ma da quello che ho visto fino ad ora è strattamente collegata alla VCL ed io sto implementando il mio codice in una dll.

    Grazie dell'aiuto

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    Purtroppo non mi è possibile capire di più la tua situazione che mi sembra alquanto intricata.

    Non credo sia un buon metodo aggiornare Vret alla terminazione di un thread poichè devi tenere conto che tale variabile può essere scritta da più thread in ordine sparso ed inoltre - se ho capito bene - rappresenta un "cumulativo", cioè il suo valore indica se *tutti* i thread sono andati a buon fine oppure no.

    Supponi che un thread vada in errore impostandola adeguatamente e un thread che termina poco dopo vada a buon fine impostandola di nuovo al valore di successo.......

    Magari, potresti inizializzare la variabile Vret ad un valore di "buon fine" e modificarla solo quando un thread non viene eseguito con successo; comunque, se hai la forzatura dell'uso dei thread e non vuoi complicarti la vita nel gestirli, puoi valutare davvero l'impiego del metodo WaitFor.

    Altro non saprei indicarti.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.