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.