Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Problemi con i thread
Forum - C# / VB.NET - Problemi con i thread

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 16:17
Venerdì, 28/11/2014
Allora il fatto è questo:
ho una lista con tot stringhe
e faccio partire n thread.
Questi thread devono fare dei controlli con le stringhe.
Come faccio a dire: thread n°1 controlla solo e soltanto la stringa n°1;thread 2 controlla la stringa 2;ecc...?
Il problemone grosso è che questi thread mi devono rimane in esecuzione per tanto tempo (anche tanti giorni, forse mesi).
Io ogni volta che premo un pulsante creo un nuovo thread e lo inserisco in una lista, in modo da farmi la mia lista di thread; ho provato ad usare una variabile contatore... ma non va bene, perchè così facendo tutti i thread Vedono lo stesso valore. (lo stesso vale se uso dei parametri di una delle due liste).
Quindi, come faccio ad avere una variabile Y (che indica il numero della stringa) che è visibile solo da un thread X?
Però anche così facendo missà che non ho molto senso perchè allora dovrei avere una variabile per ogni thread, cioè dovrei conoscere a priori il numero di thread (cosa che non mi è possibile).
Come posso risolvere?
E dato che ci sono volevo chiedere anche questo: c'è un modo semplice per gestire dei thread che devono durare più di un giorno (mesi o anche anni)?
C'è per caso un componente che permette di creare e gestire eventi giornalieri/mensili/annuali?

Scusate se ho scritto un poema è che volevo essere più chiaro possibile (anche se non so se sono riuscito ad essere chiaro :(  ;)

Grazie mille in anticipo?

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:32
Venerdì, 28/11/2014
Mesi? Anni? Si può sapere a cosa stai lavorando? In che estremo caso lavori per avere un PC che rimane acceso per anni? è un server? Se si perché si comporta in questo modo? Non vorrei che tu stia usando il sistema sbagliato per arrivare al tuo scopo.

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 22:46
Venerdì, 28/11/2014
Tranquillo, è più semplice di quel che sembra:
faccio a mala pena un paio query su un database per gestire alcuni eventi, che devo programmare appunti come se fosse un agenda, quindi con eventi giornalieri, mensili, annuali.
In teoria ero riuscito a fare tutto quanto.
Ho problemi con le gestione di più eventi in contemporanea :(
Ho fatto in modo che ogni volta che si preme un pulsante crea un thread, che poi inserisco in una lista di thread e ogni thread poi esegue un metodo dove vado a fare i vari controlli (abbastanza semplici).
Ci sono un paio di cose che non riesco a capire:
1) uso OleDBConnection per la connessione al DB e per eseguire la query; quando c'è più di un thread mi da il problema come se facessero l'apertura/chiusura della connessione quando la connessione è ancora aperta/ o gia chiusa. Non capisco come sia possibile sai perchè? Perchè io vado a fare la query sono quando arriva l'ora X. Anche se ho mille thread, ogni thread ho un orario differente, quindi non capisco come faccia a darmi il problema :(  L'ho risolto usando il Mutex prima e dopo di fare la connessione+la query.
2)Il problema della variabile associata ad un thread ho risolto così: ho utilizzato il nome del thread (gli ho dato come nome 0,1,2..)
Pensavo senno di usare i Windows.Forms.Timer, però non so se può andare...
Intanto provo a fare altri tentativi, te intanto se hai da darmi dei consigli dimmi tutto ;)

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 0:30
Sabato, 29/11/2014
Scusa ma mi sembra assurdo usare un numero sproposito di thread per un compito del genere, non sarebbe meglio un thread che controlli se la data corrente corrisponde ad un evento della lista e in caso affermativo lanci un thread che lo gestisca? in questo modo eviti un enorme quantità di thread, anche perché un processore può gestirne contemporaneamente al massimo 8 e mi riferisco a un quad core intel con hyper threading.

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 11:19
Domenica, 30/11/2014
Cioè, se ho capito bene te dici di:
usare un thread per controllare la scadenza di tutti gli eventi, e quando arriva una qualunque scadenza lancia un nuovo thread per gestirla.
Il problema è che anche quando arriva per la prima volta l'ora x, il thread non può terminare, perché l'evento è giornaliero/mensile/annuale, quindi bisogna che il thread rimanga in esecuzione tutti i giorni (all'infinito) per controllare la scadenza.
Dici che la tua soluzione può funzionare lo stesso anche con il problema del lavoro infinito?

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 17:44
Domenica, 30/11/2014
Assolutamente, ma in ogni caso gli eventi che si ripetono devono mantenere dei dati? Nel senso, lancio un evento per la prima volta, alla seconda volta ho bisogno di sapere che è gia stato lanciato una prima volta? O tutte le ripetizioni sono indipendenti?

Se la risposta all'ultima domanda è si allora puoi impostarlo cosi
-Lista di istanze eventi.
-ciclo che si ripete all'infinito e controlla se la scadenza di un evento presente nella lista è arrivata.
-in caso affermativo lancia un nuovo thread con punto di ingresso in (per esempio) eventocorrente.work().
-La funzioni gestirà la ricorrenza dell evento e si terminerà in modo naturale quando avrà finito.
Cosi facendo ogni evento sarà indipendente ma potrà modificare i dati al suo interno anche in un thread separato, non ti rimane che crerare una classe o interfaccia evento e gestirli.

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 16:57
Martedì, 02/12/2014
Scusa, ma mi sembra strano che un unico thread mi riesca a controllare tutte le scadenze che ho messo in programma (considera che poi per gli eventi giornalieri e mensili devo controllare pure la data e non solo l'ora).
Se facessi così dovrei mettere gli eventi per forza di cose in ordine cronologico, mentre io voglio poter mettere anche 200 eventi sparsi per i vari giorni.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 18:55
Martedì, 02/12/2014
Codice sorgente - presumibilmente C#

  1. class Program
  2.         {
  3.                 static List<Event> eventsList = new List<Event>();
  4.  
  5.                 static void Main(string[] args)
  6.                 {
  7.                         LoadEvents();//Carico gli eventi
  8.  
  9.                         Thread controlRecurrencesThread = new Thread(new ThreadStart(ControlRecurrences));
  10.                         controlRecurrencesThread.IsBackground = true;
  11.                         controlRecurrencesThread.Start();
  12.                 }
  13.  
  14.                 static void ControlRecurrences()
  15.                 {
  16.                         while(true)
  17.                         {
  18.                                 foreach(Event e in eventsList)
  19.                                 {
  20.                                         if(e.IsElapsed)
  21.                                         {
  22.                                                 Thread eventThread = new Thread(new ThreadStart(e.Work));
  23.                                                 eventThread.IsBackground = true;
  24.                                                 eventThread.Start();
  25.                                         }
  26.                                 }
  27.                         }
  28.                 }
  29.         }
  30.  
  31.         class Event
  32.         {
  33.                 public bool IsElapsed
  34.                 {
  35.                         get { return /*true se l'evento è arrivato alla scadenza*/ }
  36.                 }
  37.  
  38.                 public void Work()
  39.                 {
  40.                         //Gestione dell'evento
  41.                 }
  42.         }



Cosi? Non puo andare? Ovviamente è solo un abbozzo.

PM Quote
Avatar
Dice (Normal User)
Expert


Messaggi: 238
Iscritto: 26/11/2011

Segnala al moderatore
Postato alle 9:41
Venerdì, 05/12/2014
Guarda ti dico cosa ho fatto XD  :
alla fine ho provato a fare come ti dicevo io (un thread infinito per ogni evento)...
il progetto funziona, non da errori, ma... ho voluto controllare per curiosità l'utilizzo della CPU...
100 PER CENTO!!!!!
Non pensavo che già soltanto 4 o 5 thread mi ciucciassero tutta la CPU... pensavo che accadesse magari con 100 thread XD

Adesso provo a fare come dici te, poi ti faccio sapere se ho problemi ;)

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo