Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338

    [c# - winform] Thread e aggiornamento datagridview

    Ciao a tutti,

    ho una applicazione che mi serve per verificare lo stato dei pc della lan e mi permette di accenderli o spegnerli da remoto. Per la fase di verifica utilizzo un thread per evitare di bloccare l'applicazione per il tempo necessario a fare il poll dei sistemi o ad attendere il tempo di startup o shutdown.

    Non capisco come mai se eseguo dei test di accensione / spegnimento su una macchina che chiamo A, il thread di verifica mi aggiorna la datagridview correttamente modificando lo status del pc in esame, mentre se accendo / spengo una macchina B, la verifica dello stato non riesce ad aggiornare la datagridview, anche se con un break vedo che le variabili fino a quel punto sono ok.. cosa strana è che se quando il thread si ferma sul breakpoint visual studio 2005 ci mette qualche secondo a farmi vedere le variabili e poi se premo F10 non avanza di un solo passo ma in pratica prosegue come se premessi F5.



    l'aggiornamento della datagridview lo faccio (spero) nel thread principale tramite una callback via delegate..

    grazie

    codice:
    // metodo di callback da VerificaStatoSingoloClient
    public void RitornaDaVSSC(int id, string status_old, string status_new, int durata)
    {
        int auxId = 0;
        int i = 0;
        // cerca la nuova posizione del client nel datagridview e la salva in [i]
        int tot = dgvElencoClient.RowCount; 
        for (i = 0; i < tot; i++)
        {
            auxId = (int)dgvElencoClient.Rows[i].Cells["ID"].Value;
            if (auxId == id)
                break;
        }
    
        _ultima_attesa = durata;
    
        // aggiorna stato in tabella
        if (status_new != status_old)
        {
            if (status_old == "On")
                _client_on -= 1;
            if (status_old == "Off")
                _client_off -= 1;
            if (status_old == "-")
                _client_unknown -= 1;
    
            if (status_new == "On")
            {
                _client_on += 1;
                dgvElencoClient.Rows[i].Cells["St"].Style.BackColor = Color.YellowGreen;
                dgvElencoClient.Rows[i].Cells["St"].Value = "On";
            }
            else if (status_new == "Off")
            {
                _client_off += 1;
                dgvElencoClient.Rows[i].Cells["St"].Style.BackColor = Color.OrangeRed;
                dgvElencoClient.Rows[i].Cells["St"].Value = "Off";
            }
            else
            {
                _client_unknown += 1;
                dgvElencoClient.Rows[i].Cells["St"].Style.BackColor = Color.White;
                dgvElencoClient.Rows[i].Cells["St"].Value = "-";
            }
    
            // chiamata thread-safe per aggiornamento totali client
            this.BeginInvoke(new EventHandler(AggiornaTotali));
        }
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    tra l'altro non capisco perchè la chiamata ad AggiornaTotali ho dovuto metterla in un BeginInvoke poichè mi dava errore cross-thread ed invece le istruzioni

    codice:
    dgvElencoClient.Rows[i].Cells["St"].Value ..
    me le accetta..


  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    qualcuno è tornato dalle vacanze?

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    338
    up

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 © 2024 vBulletin Solutions, Inc. All rights reserved.