IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Opérations inter thread inter class / exécuter procédure sur le thread principal [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Juriste
    Inscrit en
    Mars 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Juriste
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2004
    Messages : 49
    Points : 40
    Points
    40
    Par défaut Opérations inter thread inter class / exécuter procédure sur le thread principal
    Bonjour à toutes et tous,

    Pardon d'avance si la terminologie employée est impropre (juriste de profession).

    Débutant, je développe à l'aide de visualstudio une petite appli sur la base du navigateur cefsharp de consultations de bases environnementales et de génération de pdf (pour qu'ils soient annexés à des actes notariés électroniques).

    Mon Application Winforms (Class Form1) lors d'un évènement javascript onclick appelle une procédure dans une seconde class (Class Bound) qui elle même appelle une procédure de ma form1 (en fait, je désactive un bouton impression d'une page web et j'attribue à ce bouton un évènement javascript onclick à partir duquel je veux lancer une procédure de création d'un fichier PDF (une impression pdf de la page web).

    Mon souci est que cette dernière procédure (création d'un pdf) qui est sur Form1 s'exécute non dans le thread principal mais dans le thread de travail de ma procédure d'appel de la seconde class, ce qui provoque des exceptions 'System.NullReferenceException' dans mon appli.

    DANS FORM 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Browser = New ChromiumWebBrowser("https://www.geoportail.gouv.fr/carte?c=3.164349169221308,46.82989009658934&z=6&l0=DGAC-PEB_BDD_FXX_WM_WMS::GEOPORTAIL:OGC:WMS(1)&l1=GEOGRAPHICALGRIDSYSTEMS.MAPS.3D::GEOPORTAIL:OGC:WMTS==aggregate(0.2265625)&permalink=yes") With {
            .Dock = DockStyle.Fill
                }
            CefSharpSettings.LegacyJavascriptBindingEnabled = True
            CefSharpSettings.WcfEnabled = True
     
            Dim obj As New BoundObject()
     
            Browser.JavascriptObjectRepository.Register("bound", obj, True, BindingOptions.DefaultBinder)
    PUIS L'EVENNEMENT JAVASCRIPT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     Private Sub Browser_LoadingStateChanged(sender As Object, e As LoadingStateChangedEventArgs) Handles Browser.LoadingStateChanged
     
                path1 = Application.StartupPath & "\temp\" & utilisateur & "\geoportail01.pdf"
     
                Dim jsScript As String = ""
                jsScript = <js><![CDATA[
    document.getElementById('print-comment').disabled=true;
    document.getElementById('print-submit').value='Imprimer';
    var element = document.getElementById('print-submit');
    element.type = "button";
    element.onclick = function (){bound.onClicked(window.getSelection().toString());};
    ]]></js>
     
                Browser.ExecuteScriptAsync(jsScript)
     
    (...)
     
     
        End Sub
    LE DEBUT DE LA PROCEDURE DE CREATION DU PDF


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        Public Async Sub PDF_Click()
     
            Dim source As String = Await Browser.GetBrowser().MainFrame.GetSourceAsync()
     
     
            (...)
    ENFIN MA CLASS BOUNDOBJECT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Public Class BoundObject
        Friend browser As ChromiumWebBrowser
     
        Public Sub OnClicked(ByVal selected As String)
     
            Form1.PDF_Click()
        End Sub
     
    End Class
    J'ai essayé de lancer Form1.PDF_Click() au moyen d'un délégué sur ma FORM 1 mais rien à faire Form1.PDF_Click() ne s'éxécute pas dans mon thread principal.

    Je suis perdu, je ne comprends pas comment procéder pour exécuter Form1.PDF_Click() dans le thread principal si appelé de mon autre class.

    Il existe surement une autre méthode pour déclencher une procédure à partir d'un évènement javascript sans passer par une class secondaire ou mais je n'ai pas trouvé/compris dans mes lectures.

    Merci pour l'aide que vous pourrez m'apporter.

  2. #2
    Membre du Club
    Homme Profil pro
    Juriste
    Inscrit en
    Mars 2004
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Juriste
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2004
    Messages : 49
    Points : 40
    Points
    40
    Par défaut
    Bonjour,

    Comme je ne parvenais pas à exécuter ma procédure sur le thread principal en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Class BoundObject
    Public Sub OnClicked()
      Form1.Invoke(New Form1.dTest(AddressOf Form1.Test))
    End Sub 
    End Class
    ( ignorance de ma part concernant le cross class où limitation due à " Browser.JavascriptObjectRepository.Register("bound", obj, True, BindingOptions.DefaultBinder)" ???)

    j'ai contourné le problème de la manière suivante :

    1- ajout d'une variable globale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Class GlobalVariables
    Public Shared onclic As String
    End Class
    2- modification de ma class boundobject
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Class BoundObject
    Public Sub OnClicked(ByVal selected As String)
    GlobalVariables.impress = "oui"
    End Sub
    End Class
    3- dans ma form1, ajout d'un timer que je lance à la fin du chargement de ma page web

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Timer3.Enabled = True
    Timer3.Interval = 2000
    Timer3.Start()
    3- dans ma form1, ajout d'un délégué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Delegate Sub dTest()
    4- dans ma form1, le code de mon timer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
    If GlobalVariables.onclic = "oui" Then
    Invoke(New dTest(AddressOf PDF_Click))
    GlobalVariables.onclic= "non"
    End If
    End Sub
    Le clic sur le bouton d'impression de la page web déclenche un évènement javascrpt onclick qui est transformé en objet et dirigé vers une procédure procédure onclicked de ma class boundobject.
    La variable globale onclic est affublée d'un "oui " par cette procédure.
    Pendant ce temps, le timer "vérifie" toutes les 2 secondes le contenu de ma variable globale et si elle est égale à "oui" déclenche le délégué qui va lancer dans le thread principal la procédure de création de pdf.

    Ça fonctionne, c'est crado mais hélas je ne suis pas capable de mieux...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. éviter opération inter thread
    Par Pol63 dans le forum VB.NET
    Réponses: 10
    Dernier message: 25/08/2014, 22h32
  2. [Débutant] Opération inter-Thread + inter-Class
    Par Orci76 dans le forum VB.NET
    Réponses: 2
    Dernier message: 03/05/2012, 09h59
  3. Opérations inter-threads entre deux classes
    Par Nicorombe dans le forum VB.NET
    Réponses: 3
    Dernier message: 07/05/2011, 16h36
  4. Opération inter-threads non valide
    Par nakk01 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 26/05/2009, 01h43
  5. Erreur : Opération inter-threads non valide
    Par cadeau dans le forum C++/CLI
    Réponses: 1
    Dernier message: 12/12/2006, 09h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo