+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Handler evento di oggetto in thread separato non funziona

  1. #1
    cepu96 non è in linea Novello
    Post
    37

    Unhappy Handler evento di oggetto in thread separato non funziona

    Salve a tutti,
    Utilizzo un controllo NotifyIcon che faccio comparire da un thread separato, ma sembra che a causa di ciò non mi vadano gli handler degli eventi.
    Il codice è semplice. Avvio un thread separato che a un certo punto chiama ShowBalloonTip, e in effetti il Balloon viene mostrato.
    Ma se io ci clicco sopra (sul balloon), non mi parte l'handler dell'evento BalloonTipClicked (che ho creato)

    Ho fatto una prova, se faccio mostrare il balloon dal thread principale mi funziona l'handler.

    Come risolvo?

    Ho provato a:
    1- Aggiungere l'handler dinamicamente dal thread separato, subito prima di visualizzare il Balloon
    2- Usare il metodo Invoke col seguente codice:
    codice:
    'Dichiarazioni
    Delegate Sub NotifyIconDelegate(ByVal Time As Integer)
    
    'Nel codice del thread separato
    ApplicationBarIcon.Visible = True
    ShowBalloon(10000)
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    
    Private Sub ShowBalloon(ByVal Time As Integer)
            If Me.InvokeRequired Then
                Me.BeginInvoke(New NotifyIconDelegate(AddressOf ShowBalloon), Time)
            Else
                AddHandler ApplicationBarIcon.BalloonTipClicked, AddressOf ApplicationBarIcon_BalloonTipClicked
                ApplicationBarIcon.ShowBalloonTip(Time)
            End If
    End Sub
    
    'Handler
    Private Sub ApplicationBarIcon_BalloonTipClicked(ByVal sender As Object, ByVal e As System.EventArgs)
    MsgBox("Hai cliccato sul Balloon")
    End Sub
    Ma non c'è verso di farlo andare. Sapete come aiutarmi?

  2. #2
    Post
    2,257
    Blogs
    6
    I controlli è sempre meglio farli creare dal ThreadGUI (il thread principale), poi da qualsiasi Thread secondario potrai richiamare Metodi e Proprietà avvalendoti dell' INVOKE se è necessario.
    NB: Per copiare il codice inserito con il SyntaxHighlighter (codice colorato con numeri di riga a fianco), prima si deve eseguire un DoppioClick sul codice e successivamente copiarne il contenuto, altrimenti si avranno problemi di Formattazione
    ___
    VB.Net: {Extension Methods} {Lambda Expressions} {BinaryFormatter} {GetExternalIp} {CustomBinding}
    HowTo: {Windows 7 - Installare il Sistema su C e la cartella Users su D}{Windows 7 - Spostare la cartella Users su altra Partizione}
    Blog: {Fix's Blog}

  3. #3
    cepu96 non è in linea Novello
    Post
    37
    Il controllo lo creo nel thread principale
    Ho trovato il problema: devo mostrare l'icona dal ThreadGUI (ApplicationBarIcon.Visible = True)

    codice:
    Private Delegate Sub ShowNotifyIconDelegate()
    
    Private Sub ShowSisTrayIcon()
            If Me.InvokeRequired Then
                Me.Invoke(New ShowNotifyIconDelegate(AddressOf ShowSisTrayIcon))
            Else
                ApplicationBarIcon.Visible = True
            End If
        End Sub

  4. #4
    Post
    2,257
    Blogs
    6
    Bhè che l'icona fosse visibile lo davo per scontato

    A parte che l'icona potresti visualizzarla all'avvio dell'applicazione, o comunque prima di creare il nuovo Thread (che alla fine userebbe sempre Invoke....), ti consiglio di usare il Delegato MethodInvoker per richiamare le Sub senza parametri ed i delegati Action: (Action (Of T); Action(Of T1,T2) ; Etc...) per quelli dove è necessario passare argomenti.

    In questo modo puoi risparmiarti la dichiarazione di tutti i delegati.

    es Sub senza parametri:
    codice:
    Me.Invoke(New MethodInvoker(AddressOf ShowSisTrayIcon))
    es Sub con 1 parametro Integer:

    codice:
    Me.BeginInvoke(New Action(Of Integer) (AddressOf ShowBalloon), Time)
    Ovviamente, ai fini funzionali, non cambia nulla, puoi benissimo continuare a dichiararti i delegati singolarmente.
    NB: Per copiare il codice inserito con il SyntaxHighlighter (codice colorato con numeri di riga a fianco), prima si deve eseguire un DoppioClick sul codice e successivamente copiarne il contenuto, altrimenti si avranno problemi di Formattazione
    ___
    VB.Net: {Extension Methods} {Lambda Expressions} {BinaryFormatter} {GetExternalIp} {CustomBinding}
    HowTo: {Windows 7 - Installare il Sistema su C e la cartella Users su D}{Windows 7 - Spostare la cartella Users su altra Partizione}
    Blog: {Fix's Blog}

+ Rispondi al Thread

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