Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,580

    vb.net e thread,messaggio dopo esecuzione

    salve a tutti
    dato il seguente codice
    codice:
              
     Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
            Select Case e.Button.Text
                Case Is = "Esporta"
                    Call Esporta()
    
                    MsgBox("Aggiornamento eseguito con successo", MsgBoxStyle.Information, "Export")
            
            End Select
        End Sub
        Private Sub Esporta()
    
            If  Me.CHK_Vettore.Checked = True Then
                   t = New System.Threading.Thread(AddressOf )
                EsportaAnagrafica()
                    t.Start()
            End If
    
            If Me.CHK_Articoli.Checked = True Then
                t = New System.Threading.Thread(AddressOf EsportaArticoli)
                    EsportaArticoli()
                t.Start()
            End If
        end sub
    ho diversi prroblemi e non so come risolverli

    1)dalla toolbar spingo il pulsante "esporta" dopo la chiamata alla routine,do un messaggio di avviso che è stato tutto esportato, peccato che avendo dei thread mi da prima il messaggio, e solo dopo esporta!!!,come posso far eseguire prima l'esportazione e solo dopo il messaggio?

    2)nella routine esporta(), chiamo 2 sub che mi esportano, una gli articoli e l'altra le anagrafiche, come posso far eseguire la rotine esportaarticoli(), solo dopo che è stato eseguito esportaAnagrafica()?

    grazie
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  2. #2

    Re: vb.net e thread,messaggio dopo esecuzione

    Originariamente inviato da Kahm
    1)dalla toolbar spingo il pulsante "esporta" dopo la chiamata alla routine,do un messaggio di avviso che è stato tutto esportato, peccato che avendo dei thread mi da prima il messaggio, e solo dopo esporta!!!,come posso far eseguire prima l'esportazione e solo dopo il messaggio?
    Non usare un thread separato.
    2)nella routine esporta(), chiamo 2 sub che mi esportano, una gli articoli e l'altra le anagrafiche, come posso far eseguire la rotine esportaarticoli(), solo dopo che è stato eseguito esportaAnagrafica()?
    Non usare un thread separato.
    Se il tuo unico obiettivo è di evitare di bloccare l'interfaccia grafica fai così:
    codice:
    Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
    Dim t As New System.Threading.Thread(AddressOf Esporta)
            Select Case e.Button.Text
                Case Is = "Esporta"
                    t.Start()
                End Select
        End Sub
        Private Sub Esporta()
            If  Me.CHK_Vettore.Checked = True Then
                    EsportaAnagrafica()
            End If
    
            If Me.CHK_Articoli.Checked = True Then
                    EsportaArticoli()
            End If
            MsgBox("Aggiornamento eseguito con successo", MsgBoxStyle.Information, "Export")
        end sub
    Importantissimo: usa Option Explicit, Option Strict e DICHIARA SEMPRE LE VARIABILI CHE INTENDI USARE; quella variabile "t" che spunta dal nulla nel tuo codice è un'offesa a tutte le norme di buona programmazione e un potenziale bug futuro.
    Ulteriori info:
    Option Explicit and Option Strict in Visual Basic .NET or in Visual Basic 2005
    "Option Strict Off" considered harmful
    Coding Horror: Option Strict and Option Explicit in VB.NET 2005


    Curiosità che ho notato: da quando i programmatori di VB hanno "scoperto" i thread li usano in tutte le salse, anche quando non solo non servono, ma sono anzi controproducenti.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,580

    Re: Re: vb.net e thread,messaggio dopo esecuzione

    Originariamente inviato da MItaly
    Non usare un thread separato.

    Non usare un thread separato.
    Se il tuo unico obiettivo è di evitare di bloccare l'interfaccia grafica fai così:
    codice:
    Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
    Dim t As New System.Threading.Thread(AddressOf Esporta)
            Select Case e.Button.Text
                Case Is = "Esporta"
                    t.Start()
                End Select
        End Sub
        Private Sub Esporta()
            If  Me.CHK_Vettore.Checked = True Then
                    EsportaAnagrafica()
            End If
    
            If Me.CHK_Articoli.Checked = True Then
                    EsportaArticoli()
            End If
            MsgBox("Aggiornamento eseguito con successo", MsgBoxStyle.Information, "Export")
        end sub
    Importantissimo: usa Option Explicit, Option Strict e DICHIARA SEMPRE LE VARIABILI CHE INTENDI USARE; quella variabile "t" che spunta dal nulla nel tuo codice è un'offesa a tutte le norme di buona programmazione e un potenziale bug futuro.

    Curiosità che ho notato: da quando i programmatori di VB hanno "scoperto" i thread li usano in tutte le salse, anche quando non solo non servono, ma sono anzi controproducenti.
    ciao
    come faccio a riutilizzare lo stesso thread ma dandogli sub diverse?

    p.s.
    esportaarticoli() ed esportaanagrafiche() contengono 1000 record l'una e vanno a modfiicare una scrollbar con possiblita' di fermarsi, quindi è quasi d'obbligo un thread
    p.s.2
    quella veriabile t è stata dichiarata nella sezione generale: Dim t As Threading.Thread
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  4. #4

    Re: Re: Re: vb.net e thread,messaggio dopo esecuzione

    Originariamente inviato da Kahm
    come faccio a riutilizzare lo stesso thread ma dandogli sub diverse?
    La stessa variabile di tipo Thread, vorrai dire; tra l'altro è proprio quello che fai nel codice che hai postato: quando assegni a t un nuovo thread tu assegni alla variabile t un puntatore al nuovo oggetto Thread, e l'oggetto Thread che la variabile puntava in precedenza si trova senza alcun riferimento. Alla prima esecuzione del Garbage Collector quindi l'oggetto Thread in questione verrà eliminato senza pietà, anche se non ho idea di cosa potrà succedere al codice in esecuzione in quel thread.
    Ora che ci penso anche la mia soluzione soffre di un problema simile, poiché dichiarando una variabile thread interna al gestore di eventi questa ad un certo punto uscirà dall'ambito di visibilità con effetti per me imprevedibili. L'unica è utilizzare una variabile a livello di classe come avevi detto tu a cui però non venga assegnato mai un nuovo thread a meno che quello precedente non abbia terminato il suo lavoro:
    codice:
    Private threadExporta As New System.Threading.Thread(AddressOf Esporta) 'Questo thread verrà usato SOLO per l'esportazione per evitare confusione
    '...
    Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
            Select Case e.Button.Text
                Case Is = "Esporta"
                    if (myThread.ThreadState And (ThreadState.Stopped Or ThreadState.Unstarted)) = 0 Then
                        MessageBox.Show("È già in corso l'esportazione dei dati") 'Eventualmente aggiungere un po' di flag di stile
                    else
                    threadEsporta.Start()
                    End If
                End Select
        End Sub
        Private Sub Esporta()
            If  Me.CHK_Vettore.Checked = True Then
                    EsportaAnagrafica()
            End If
    
            If Me.CHK_Articoli.Checked = True Then
                    EsportaArticoli()
            End If
            MsgBox("Aggiornamento eseguito con successo", MsgBoxStyle.Information, "Export")
        end sub
    In ogni caso al di là della faccenda della variabile locale la mia soluzione dovrebbe risolvere il tuo problema: il gestore di eventi chiama esporta in un thread separato, in modo che l'esportazione dei record proceda in ordine corretto (grazie al fatto che esporta() non crea altri thread e perciò le operazioni in essa contenuta proseguono in ordine sequenziale) ma che al contempo ci sia un thread separato che si occupa di queste operazioni.
    p.s.
    esportaarticoli() ed esportaanagrafiche() contengono 1000 record l'una e vanno a modfiicare una scrollbar con possiblita' di fermarsi, quindi è quasi d'obbligo un thread
    I controlli Windows Forms (ProgressBar compresa) non sono thread-safe, quindi non andrebbero MAI chiamati da un thread differente da quello che li ha creati. Si è già parlato di recente di una soluzione che utilizza un timer per ovviare al problema, effettua una ricerca nel forum.
    p.s.2
    quella veriabile t è stata dichiarata nella sezione generale: Dim t As Threading.Thread
    Vedi sopra.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it L'avatar di Kahm
    Registrato dal
    Dec 2004
    residenza
    Rome
    Messaggi
    3,580

    Re: Re: Re: Re: vb.net e thread,messaggio dopo esecuzione

    Originariamente inviato da MItaly
    La stessa variabile di tipo Thread, vorrai dire; tra l'altro è proprio quello che fai nel codice che hai postato: quando assegni a t un nuovo thread tu assegni alla variabile t un puntatore al nuovo oggetto Thread, e l'oggetto Thread che la variabile puntava in precedenza si trova senza alcun riferimento. Alla prima esecuzione del Garbage Collector quindi l'oggetto Thread in questione verrà eliminato senza pietà, anche se non ho idea di cosa potrà succedere al codice in esecuzione in quel thread.
    Ora che ci penso anche la mia soluzione soffre di un problema simile, poiché dichiarando una variabile thread interna al gestore di eventi questa ad un certo punto uscirà dall'ambito di visibilità con effetti per me imprevedibili. L'unica è utilizzare una variabile a livello di classe come avevi detto tu a cui però non venga assegnato mai un nuovo thread a meno che quello precedente non abbia terminato il suo lavoro:
    codice:
    Private threadExporta As New System.Threading.Thread(AddressOf Esporta) 'Questo thread verrà usato SOLO per l'esportazione per evitare confusione
    '...
    Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles ToolBar1.ButtonClick
            Select Case e.Button.Text
                Case Is = "Esporta"
                    if (myThread.ThreadState And (ThreadState.Stopped Or ThreadState.Unstarted)) = 0 Then
                        MessageBox.Show("È già in corso l'esportazione dei dati") 'Eventualmente aggiungere un po' di flag di stile
                    else
                    threadEsporta.Start()
                    End If
                End Select
        End Sub
        Private Sub Esporta()
            If  Me.CHK_Vettore.Checked = True Then
                    EsportaAnagrafica()
            End If
    
            If Me.CHK_Articoli.Checked = True Then
                    EsportaArticoli()
            End If
            MsgBox("Aggiornamento eseguito con successo", MsgBoxStyle.Information, "Export")
        end sub
    In ogni caso al di là della faccenda della variabile locale la mia soluzione dovrebbe risolvere il tuo problema: il gestore di eventi chiama esporta in un thread separato, in modo che l'esportazione dei record proceda in ordine corretto (grazie al fatto che esporta() non crea altri thread e perciò le operazioni in essa contenuta proseguono in ordine sequenziale) ma che al contempo ci sia un thread separato che si occupa di queste operazioni.

    I controlli Windows Forms (ProgressBar compresa) non sono thread-safe, quindi non andrebbero MAI chiamati da un thread differente da quello che li ha creati. Si è già parlato di recente di una soluzione che utilizza un timer per ovviare al problema, effettua una ricerca nel forum.

    Vedi sopra.
    ma si che si puo' fare..io appena concludero' uesto thread
    cerco di implementargli un delegate per modificare i controlli da thread!
    NN vi diro mai chi sono in realta,
    tutti i miei 3D sono orfani, non insistete per farmi rispondere ai 3D aperti da me

  6. #6
    Come ti ho già detto se n'è già parlato in passato e non si può fare neanche con i delegati... dai un'occhiata a questa discussione e in particolare a questo post e al successivo.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.