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

  1. #1
    Membre régulier
    sub main déclaré introuvable mais présent !
    Bonjour

    J'ai récemment migré (4 mois) sur VB 2019 qui fonctionne bien pour tous mes programmes en mode Form.

    Pour créer une application avec des threads je recherche des applications exemples de thread sur le site https://docs.microsoft.com/fr-fr/dot...tframework-4.8

    Comme cet exemple qui montre comment utiliser invoke :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Imports System.Threading
    Imports System.Threading.Tasks
     
    Module InvokeDemo
     
        ' Demonstrated features:
        '   Parallel.Invoke()
        ' Expected results:
        '   The threads on which each task gets executed may be different.
        '   The thread assignments may be different in different executions.
        '   The tasks may get executed in any order.
        ' Documentation:
        '   http://msdn.microsoft.com/library/dd783942(VS.100).aspx
        Private Sub Main()
            Try
                ' Param #0 - static method
                Parallel.Invoke(AddressOf BasicAction,
                                Sub()
                                    ' Param #1 - lambda expression
                                    Console.WriteLine("Method=beta, Thread={0}", Thread.CurrentThread.ManagedThreadId)
                                End Sub,
                                Sub()
                                    ' Param #2 - in-line delegate
                                    Console.WriteLine("Method=gamma, Thread={0}", Thread.CurrentThread.ManagedThreadId)
                                End Sub)
            Catch e As AggregateException
                ' No exception is expected in this example, but if one is still thrown from a task,
                ' it will be wrapped in AggregateException and propagated to the main thread.
                Console.WriteLine("An action has thrown an exception. THIS WAS UNEXPECTED." & vbLf & "{0}", e.InnerException.ToString())
            End Try
        End Sub
     
        Private Sub BasicAction()
            Console.WriteLine("Method=alpha, Thread={0}", Thread.CurrentThread.ManagedThreadId)
        End Sub
     
    End Module


    J'ouvre Visual studio sur la console en visual basic (application console (.NET Framework 4.72)) que je cré.

    Je copie le programme ci-dessus dans le code.

    Lorsque je lance le programme par 'Démarrer' il apparait l'erreur BC30420 'Sub Main' est introuvable dans "ConsoleApp6.module1"

    Or que Sub Main est bien présent dans le code ci-dessus !

    Ce problème se reproduit pour tout les exemples du site concernant les thread sur console.

    Il est vrai que je n'ai pas utilisé console depuis la migration.

    Faut-il configurer ma plateforme ?

    J'utilise la mauvaise application ?

    Autre problème lié au code qui est peut être incomplet ?

    Merci pour votre aide
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  2. #2
    Expert éminent sénior
    essaye de remplacer private par public
    sinon essaye une class à la place du module (avec une public shared sub main)
    sinon tu peux aller voir dans les propriétés du projet, y a un combobox qui permet de choisir l'objet de démarrage, la sub main doit être listée
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier
    Bonjour,

    Merci pour tes conseils ! J'ai changé private en public et effectivement le démarrage était sur 'module' et non sur 'sub main'. Une fois corrigé le module fonctionne parfaitement. Il faut ajouter un thread.sleep(3000) pour avoir le temps de lire le contenu de la console.

    Par contre en remplaçant le module par une classe et en 'public shared sub main' la compilation donne l'erreur suivante :
    Erreur BC30518 La résolution de surcharge a échoué, car aucun 'Invoke' accessible ne peut être appelé avec ces arguments*:
    'Public Shared Overloads Sub Invoke(ParamArray actions As Action())': Impossible de faire référence à un membre instance d'une classe à partir d'une méthode partagée ou d'un initialiseur de membre partagé sans une instance explicite de la classe.
    et là je cale !

    Une idée ?

    A vous lire
    Merci
    La Connaissance est comme le rire elle est contagieuse en la partageant!

  4. #4
    Expert éminent sénior
    dans une appli console on ajoute souvent Console.ReadKey (ou ReadLine) ce qui permet de garder la fenêtre ouverte jusqu'à l'appuie sur une touche (ou entrée)
    avec un console.WriteLine("appuyez sur une touche pour quitter") avant ca fait pas mal

    après le compilateur te précises que tu veux appeler une méthode non shared depuis une méthode shared ce qui est interdit
    il faut donc que ta méthode BasicAction soit déclarée Shared aussi

    après si tu fais des modules tu dois venir de vb6, et il faut comprendre la POO pour comprendre ce qu'est Shared, sachant qu'un membre Shared correspond à peu près à un membre de module, c'est accessible de partout sans instance
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Merci Pol63 pour tes explications perspicaces.

    Effectivement (méa culpa) le manuel en ligne précise que les routines doivent être shared !

    Efficace le truc su stand by avec ReadKey.

    Tu as raison je vient du vb6 et même beacoup plus loin Turbo Basic puis Power Basic ! Et j'oublie les ancêtres sur HP avec une ligne de programme affiché en 1979 ! Le programme et résultats s'affichait sur ruban papier comme les caisses de magasin.

    Le programme écrit ainsi en Class fonctionne parfaitement :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Imports System.Threading
    Imports System.Threading.Tasks
     
    Class InvokeDemo
     
        Public Shared Sub Main()
            Try
     
                Parallel.Invoke(AddressOf BasicAction,
                                Sub()
     
                                    Console.WriteLine("Method=beta, Thread={0}", Thread.CurrentThread.ManagedThreadId)
     
                                End Sub,
                                Sub()
     
                                    Console.WriteLine("Method=gamma, Thread={0}", Thread.CurrentThread.ManagedThreadId)
                                End Sub)
            Catch e As AggregateException
                ' No exception is expected in this example, but if one is still thrown from a task,
                ' it will be wrapped in AggregateException and propagated to the main thread.
                Console.WriteLine("An action has thrown an exception. THIS WAS UNEXPECTED." & vbLf & "{0}", e.InnerException.ToString())
            End Try
     
            Console.WriteLine("appuyez sur une touche pour quitter")
            Console.ReadKey()
       End Sub
     
        Public Shared Sub BasicAction()
            Console.WriteLine("Method=alpha, Thread={0}", Thread.CurrentThread.ManagedThreadId)
        End Sub
     
    End Class


    Merci pour vos aides.
    La Connaissance est comme le rire elle est contagieuse en la partageant!