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

    [C#] Mettere in pausa / riprendere un thread

    Salve, nonostante questa sia una cosa piuttosto semplice da fare in diversi linguaggi sto avendo non pochi problemi a realizzarla in C#, sicuramente a causa della mia inesperienza.

    L'obiettivo è semplice:
    - dal mio thread principale (main) creo ed avvio un secondo thread (child)
    - child ha al suo interno un loop che genera numeri casuali, comunicando a Main uno dei numeri generati ed andando in pausa.
    - Main in certe condizioni vuole togliere la pausa a Child, facendogli fare un singolo ulteriore ciclo che genera un nuovo numero e glielo fornisce.

    di per se è inutile come cosa, ma se riesco a farlo funzionare lo posso applicare al mio contesto che è ovviamente più complesso e sensato diciamo. Non è neanche importante che Child generi un numero casuale (non è l'obiettivo del mio programma), è importante che ad ogni ciclo riesca a comunicare un nuovo valore a Main.

    Ho provato varie cose, thread normale, background worker, ma mi ritrovo sempre con un diverso problema, sempre correlato con il non riuscire a gestire bene pausa/resume del thread! Sto gugolando da ore in cerca di un approccio giusto da seguire ma non riesco proprio ad uscirne fuori.

    Grazie in anticipo!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320

    Moderazione

    Ho spostato la discussione nel forum di competenza (Visual Basic & .NET Framework).

    In futuro poni qui le domande relative ai linguaggi .NET.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ci fai vedere una tua prova ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Quote Originariamente inviata da oregon Visualizza il messaggio
    Ci fai vedere una tua prova ?
    Ciao, sono riuscito a farlo ma è un po' "zozza" come cosa, in particolare visto che dovrò richiamare questa funzione molte volte! Mi serve la massima efficienza possibile e penso che ci sia un largo margine di miglioramento!

    Nel mio caso reale non devo generare numeri casuali ma andare a leggere una lista di file dal drive e sputare fuori il path ogni volta che me ne serve uno! Attualmente per "tirare fuori" il singolo path dal thread lo faccio scrivere su una variabile statica pubblica e lo leggo da fuori il thread, ma non mi piace molto come soluzione! Ne esistono di più efficienti?

    Ecco il codice che ho usato, basta richiamare prima threadStart() e poi getNext() ogni volta che serve un nuovo valore:

    codice:
    private static ManualResetEvent ThreadEvent = new ManualResetEvent(false);
    private Thread SampleThread = null;
    private static Boolean terminateThread = false;
    public static string singleFile = "";
    
    
    public void ReadFile()
    {
        //normalmente uso la @ prima del path, ho cambiato in C:\\ visto che piace di più al parser del forum
        foreach (string FilePath in Directory.GetFiles("C:\\", "*.txt", SearchOption.AllDirectories))
        {
            singleFile = FilePath;
    
    
            ThreadEvent.Reset();
            ThreadEvent.WaitOne();
    
    
            if (terminateThread) break;
        }
    
    
        //Lettura del thread terminata
    
    
    }
    
    
    private void startThread()
    {
        SampleThread = new Thread(new ThreadStart(ReadFile));
        Thread InstanceCaller = new Thread(new ThreadStart(ReadFile));
        InstanceCaller.Start();
    }
    
    
    public string getNext()
    {
        ThreadEvent.Set();
        return singleFile;
    }

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Per quello che vuoi fare tu mi sembra abbastanza funzionale ma è il principio che mi sfugge.

    Chi ti vieta di leggere tutta la cartella in una lista nel trhead e ottenere un file per volta dalla lista?

    Fra l'altro, non penso che la GetFiles nella foreach già avviata tenga conto di file aggiunti/rimossi durante l'enumerazione ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    ciao, grazie per la risposta!

    non voglio fargli leggere tutto a colpo singolo perché deve funzionare anche con cartelle con numeri elevati di file (anche 500.000) ed il programma deve essere sempre reattivo, senza considerare che per ogni file ci sono certe operazioni da fare che non voglio delegare al thread principale del programma sempre per questioni di reattività generale

    il getFiles è una soluzione temporanea, attualmente lui si carica comunque tutto nella lista quindi non mi risolve la situazione, ma si sa, per risolvere un problema articolato è meglio farne un pezzettino alla volta eheh

    per il fatto che non tenga conto dei file aggiunti/rimossi è un altro problema che devo ancora decidere come affrontare, ma nel mio frangente non rappresenta un problema reale in quanto il contenuto delle cartelle rimane lo stesso!

Tag per questa discussione

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.