Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    37

    [VB .NET] Multi-thread, invoke di sub delegate

    Salve a tutti!!

    Ho un problema, che su internet si capisce è abbastanza comune di accesso da un thread ad oggetti di un altro.
    Per farla breve vi schematizzo (se non è chiaro chiedete pure) lo scheletro del mio programma e i punti salienti:

    codice:
    class form1
    
    'in un button avvio in un nuovo thread la esegui all'interno della classe prova
    
    public sub funzionecondivisa()
    Dim a As Boolean = False
    
            For Each f As Form In Application.OpenForms
                If Form3.Name = f.Name Then
                    a = True
                End If
            Next
    
            If a Then
                Form3.Button3.PerformClick()
    
            End If
    end sub
    
    
    public class prova
    
    public sub esegui ()
    
    'qui voglio richiamare una funzione esterna a questo thread, per la precisione una all'interno del form1 (e poi un'altra nel mio form3)

    Ricapitolando, ho omesso parecchie cose, ma tutto funziona bene finchè dal mio form1 avvio un nuovo thread attraverso un button, e gli faccio eseguire la sub esegui().
    A questo punto, all'interno della stessa vorrei richiamare una funzione che è dichiarata nel form1, e mi da problemi ad accedervi, per di più forse complicanza maggiore (non so, ipotizzo) e che all'interno di questa funzionecondivisa() vado a richiamare dei controlli e proprietà del form3.
    Questa funzione dal form1 se viene richiamata funziona perfettamente e riesce ad accedere ai controlli del form3.

    Devo chiamare un'invoke? che sintassi? dove va scritta? dichiaro una delegate? dove di preciso?
    Insomma ho letto parecchie cose online, ma nonostante ciò mi perdo qualche pezzo, perché non riesco a farlo funzionare.
    Voglio capire come invocare da un thread separato delle funzioni dichiarate in un form (form1) come se fosse lui stesso ad avviarle, quindi con lo stesso funzionamento che hanno avviandole dal form proprietario.

    Sapete darmi una mano? Sono allo stremo e non so più che leggermi per capirci qualcosa.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Leggi questo documento

    http://msdn.microsoft.com/en-us/library/ms171728(v=vs.80).aspx
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    37
    Avevo letto già quel documento, il mio problema principale è che ho provato a inserire l'invokerequired nella funzione ma non capisco perché mi da sempre false e quindi la richiama normalmente, non dando errore in runtime, solo che poi mi crea una ulteriore notifyicon del form perchè fa riferimento direttamente a qualcosa in un altro thread (problema molto conosciuto e su cui si trova qualcosa in internet).

    Quello che non capisco è dove devo fare la invoke.
    Ho seguito 2 strade, ho creato un delegate delle funzioni, le funzioni non le ho per nulla modificate, e poi nel codice del thread separato ho fatto form1.invoke del delegato.
    Niente, non funziona, poi ho provato con il metodo in questo documento, dal thread separato ho solo semplicemente chiamato form1.funzionedarichiamare e nelle funzioni o sub ho modificato mettendo invokerequired e creando le delegate globalmente nel codice per chiamare la funzione. Nulla per il problema sopra citato....

    Oggi riprovo ma son scoraggiato, e non capisco cosa e dove non vada bene qualcosa.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Io ho seguito il documento e non ho mai avuto problemi.

    Probabilmente serve provare tutto il codice che utilizzi, soprattutto la parte riguardante il nuovo thread ... dalla tua spiegazione non si può determinare il problema chiaramente.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    37
    Ho provato a rifare:

    codice:
    'chiamata dal thread esterno
    form3.button3.performclick() ' in alternativa ho provato form3.button3_click ma non so che parametri passargli
    
    'nel form3
    delegate sub clicca (ByVal sender As System.Object, ByVal e As System.EventArgs)
    
    'nel button3
    
     If Me.Button3.InvokeRequired Then
                Dim d As New clicca(AddressOf Button3_Click)
                Me.Invoke(d)
    
    
            Else
    'fai operazioni
    Ho provato a chiamare un funzione:

    codice:
    'chiamata da thread esterno
    form1.update()
    
    'nel form1
    delegate function prova() as boolean 
    
    'nel update del form1
    if me.update.invokerequired 'non funziona, non è un membro di boolean e non me lo fa fare
    Allora ho provato con una semplice sub come prova ma stesso risultato, non mi prende invokerequired.
    Perché non sono controlli?
    Allora non posso richiamare sub come se il proprietario fosse il form1 o form3?
    Per il button3 comunque non va e non arriva mai ad entrare nella sub.

    Per quel che riguarda come creo il thread, ce l'ho incapsulato in una classe in form1, ho un po' di var pubbliche nella classe e un metodo pubblico, il resto private.
    Deve svolgere compiti lunghi quindi l'ho messo a parte, non deve nemmeno interagire molto con l'esterno una volta che gli ho dato un paio di parametri quando lo richiamo, però per 2 chiamate che devo fare, che mi devono aggiornare magari la vista di un form con gli errori che compaiono mentre elabora, e con l'usare una funzione dichiarata nel form1 perchè più comoda e usata da tutti gli altri form, mi sembra di impazzirci dietro.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scusa, facciamo un passo indietro ...

    Tu hai un errore "a runtime" legato ai controlli utilizzati da un altro thread, o no?

    E se sì, quale errore e dove?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    37
    No, io non ho errori di compilazione ne tanto meno di runtime.
    L'unico inconveniente che ho (avrei) è che se nel thread separato, nella sub, se da qualche parte compare form1 (o altri form del mio progetto), quindi se faccio riferimento ad oggetti di un altro form mi si duplica la notifyicon del form1, cioè è come se avviasse un nuovo form as form1.
    Di questo ho trovato qualche informazione sul web, ho letto che è un problema della programmazione ad oggetti gestita in vb .net. Se vuoi ti linko quel che ho trovato.
    Ma ho risolto passo passo, e con molto l'aiuto del debug, togliendo i riferimenti ad altri form e loro oggetti.
    Però per l'appunto ora mi rimangono circoscritte 2 chiamate a sub di thread differenti (una sub in form1 che sotto condizione scatena un form3.button3_click, e un'altra sub in form1)

    Ora se provo nel thread separato a scrivere form1.subdaavviare()
    Non da nessun errore, ne in runtime ne di compilazione.
    Però una volta avviato, appena arriva a chiamare quella istruzione mi si duplica la notifyicon.
    Per ovviare a questo devo chiamare la funzione invocandola, cioè chiamandola come se fosse lo stesso form1 che lo fa, in modo che il thread separato "non c'entri" e così salto l'empasse che ora ho.

    Spero di esser stato più chiaro, son qui per spiegazioni, spero riesci a darmi una mano, perché molto probabilmente sbaglio qualcosa, ma cosa? Dove? Non trovo nulla online che mi indirizzi nella via giusta.

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    37
    Ho risolto il problema finalmente!
    Il mio programma così è modulare e su diversi thread.

    Il problema principale era l'organizzazione del codice. Ho creato una classe che effettua l'elaborazione più lunga e viene avviata a parte.
    Ho passato alla classe il form1, cioè il chiamante, in questo modo facendo una invoke con una variabile a cui assegno form1, invece che form1.invoke, sembra non creare problemi e non creare doppie icone o comportamenti indesiderati.
    Ovviamente poi tutti i riferimenti a controlli del form1 vengono fatti dallo stesso invocando funzioni dal thread separato.

    Grazie a tutti per l'aiuto!

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.