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

Windows Forms Discussion :

[WinService][VB.NET] Comment placer un Messagebox non bloquant ?


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Points : 177
    Points
    177
    Par défaut [WinService][VB.NET] Comment placer un Messagebox non bloquant ?
    [VS.NET 2003]

    Salut les amis !

    J'ai un petit soucis dans un service: je souhaite pouvoir utiliser une MessageBox (ou équivalent) sans bloquer la suite des traitements du service (on attend pas forcément d'action de l'utilisateur)

    Voici ce que j'ai en gros:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    Imports System.ServiceProcess
    Imports System.Timers
    Imports System.windows.forms
    Imports System.IO
     
    Public Class ServiceImpression
        Inherits System.ServiceProcess.ServiceBase
     
        Private WithEvents m_Minuterie As System.Timers.Timer
        Private fichier As StreamWriter
     
    #Region " Code généré par le Concepteur de composants "
     
        Public Sub New()
            MyBase.New()
     
            ' Cet appel est requis par le Concepteur de composants.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel
     InitializeComponent()
     
        End Sub
     
        'La méthode substituée Dispose du UserService pour nettoyer la liste
     des composants.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
     
        ' Le point d'entrée principal pour le processus
        <MTAThread()> _
        Shared Sub Main()
            Dim ServicesToRun() As System.ServiceProcess.ServiceBase
     
            ' Plusieurs services NT s'exécutent dans le même processus. Pour
     ajouter
            ' un autre service à ce processus, modifiez la ligne suivante
            ' pour créer un second objet service. Par exemple,
            '
            '   ServicesToRun = New System.ServiceProcess.ServiceBase ()
     {New Service1, New MySecondUserService}
            '
            ServicesToRun = New System.ServiceProcess.ServiceBase() {New
     ServiceImpression}
     
            System.ServiceProcess.ServiceBase.Run(ServicesToRun)
        End Sub
     
        'Requis par le Concepteur de composants
        Private components As System.ComponentModel.IContainer
     
        ' REMARQUE*: la procédure suivante est requise par le Concepteur de
     composants
        ' Elle peut être modifiée à l'aide du Concepteur de composants.  
        ' Ne la modifiez pas en utilisant l'éditeur de code.
        <System.Diagnostics.DebuggerStepThrough()> Private Sub
     InitializeComponent()
            components = New System.ComponentModel.Container
            Me.ServiceName = "Service1"
        End Sub
     
    #End Region
     
        Protected Overrides Sub OnStart(ByVal args() As String)
            ' Ajoutez ici le code pour démarrer votre service. Cette méthode doit
     permettre à votre
            ' service de faire son travail.
            LancerMinuterie()
        End Sub
     
        Private Sub LancerMinuterie()
            m_Minuterie = New System.Timers.Timer(15000)
            m_Minuterie.AutoReset = False
            m_Minuterie.Enabled = True
        End Sub
     
        Protected Overrides Sub OnStop()
            ' Ajoutez ici le code pour effectuer les destructions nécessaires à
     l'arrêt de votre service.
        End Sub
     
        Private Sub OnTimedEvent(ByVal source As Object, ByVal e As
     ElapsedEventArgs) Handles m_Minuterie.Elapsed
            Dim Str As String = " il est " & DateTime.Now.Hour & ":" &
     DateTime.Now.Minute & ":" & DateTime.Now.Second
            MessageBox.Show(Str, "Service", MessageBoxButtons.OK,
     MessageBoxIcon.Information, MessageBoxDefaultButton.Button1,
     MessageBoxOptions.ServiceNotification)
            fichier = New StreamWriter("c:\partage\TESTSERVICE.txt", True)
            fichier.WriteLine(Str)
            fichier.Flush()
            fichier.Close()
            fichier = Nothing
            LancerMinuterie()
        End Sub
     
    End Class
    Actuellement je dois fermer la messagebox pour que le service puisse continuer et écrire dans le fichier...
    J'ai pensé passer par la suite à passer par un autre exe indépendant (sous réserve qu'on puisse lancer une appli depuis un service sans trop de problèmes) qui se chargerait d'afficher les messages, ce qui ne me bloquerait pas le service et pouvoir toujours écrire dans le fichier, mais ça n'est pas vraiment génial...

    Si quelqu'un a une idée...
    D'avance merci !
    "On peut dire qu’il est possible de savoir comment vaincre sans être capable de le faire" - Sun Tze, in L'art de la guerre

    "Mais t'es complètement naze ou quoi ?! UNE pomme ! ça fait DEUX moitiés de pomme !! mais quand vas-tu le comprendre ?! J'en ai ma claque, j'me tire !" - Bouddha et un disciple, dans un moment de faiblesse

  2. #2
    Nouveau membre du Club Avatar de yoyann
    Inscrit en
    Juillet 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Salut,

    Alors pour ton problème tu peux créer ta propre MessageBox et après tu l'affiche avec un Show().
    Sinon tu peux tenter de lancer ta MessageBox dans un nouveau Thread.

  3. #3
    Membre habitué Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Points : 177
    Points
    177
    Par défaut
    Salut Yoyann,

    Les threads je n'ai encore jamais fait joujou avec, aussi j'ai essayé de faire ma propre message box en prenant un formulaire windows. mais ça ne fonctionne pas bien, la fenêtre s'affiche, mais devient aussitôt blanche (le curseur de la souris devient un sablier dessus), et ainsi de suite pour tous les autres messages. Si je tente d'en fermer un, plantage du service qui s'arrête...
    Le seul truc de bien c'est que l'éxécution du service n'est pas arrêtée entre chaque message

    voilà le code de ma message box:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
     
    Public Class FrmMessageService
        Inherits System.Windows.Forms.Form
     
    #Region " Code généré par le Concepteur Windows Form "
     
        Public Sub New()
            MyBase.New()
     
            'Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            'Ajoutez une initialisation quelconque après l'appel
     InitializeComponent()
     
        End Sub
     
        'La méthode substituée Dispose du formulaire pour nettoyer la liste des
     composants.
        Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
            If disposing Then
                If Not (components Is Nothing) Then
                    components.Dispose()
                End If
            End If
            MyBase.Dispose(disposing)
        End Sub
     
        'Requis par le Concepteur Windows Form
        Private components As System.ComponentModel.IContainer
     
        'REMARQUE*: la procédure suivante est requise par le Concepteur
     Windows Form
        'Elle peut être modifiée en utilisant le Concepteur Windows Form.  
        'Ne la modifiez pas en utilisant l'éditeur de code.
        Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
        Friend WithEvents Button1 As System.Windows.Forms.Button
        <System.Diagnostics.DebuggerStepThrough()> Private Sub
     InitializeComponent()
            Me.TextBox1 = New System.Windows.Forms.TextBox
            Me.Button1 = New System.Windows.Forms.Button
            Me.SuspendLayout()
            '
            'TextBox1
            '
            Me.TextBox1.Location = New System.Drawing.Point(8, 8)
            Me.TextBox1.Multiline = True
            Me.TextBox1.Name = "TextBox1"
            Me.TextBox1.ReadOnly = True
            Me.TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Both
            Me.TextBox1.Size = New System.Drawing.Size(280, 128)
            Me.TextBox1.TabIndex = 0
            Me.TextBox1.Text = "TextBox1"
            '
            'Button1
            '
            Me.Button1.Location = New System.Drawing.Point(112, 144)
            Me.Button1.Name = "Button1"
            Me.Button1.Size = New System.Drawing.Size(56, 24)
            Me.Button1.TabIndex = 1
            Me.Button1.Text = "Button1"
            '
            'FrmMessageService
            '
            Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
            Me.ClientSize = New System.Drawing.Size(292, 174)
            Me.Controls.Add(Me.Button1)
            Me.Controls.Add(Me.TextBox1)
            Me.Name = "FrmMessageService"
            Me.Text = "FrmMessageService"
            Me.ResumeLayout(False)
     
        End Sub
     
    #End Region
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
     System.EventArgs) Handles Button1.Click
            Close()
        End Sub
     
        Public Sub AfficherMessage(ByVal Message As String)
            TextBox1.Text = Message
            Me.Show()
        End Sub
     
    End Class
     
    '#############################################
    ' appel depuis le service:
     
    Private Sub OnTimedEvent(ByVal source As Object, ByVal e As
     ElapsedEventArgs) Handles m_Minuterie.Elapsed
            Dim Str As String = " il est " & DateTime.Now.Hour & ":" &
     DateTime.Now.Minute & ":" & DateTime.Now.Second
            Dim FenMess As New FrmMessageService
            FenMess.AfficherMessage(Str)
            fichier = New StreamWriter("c:\partage\TESTSERVICE.txt", True)
            fichier.WriteLine(Str)
            fichier.Flush()
            fichier.Close()
            fichier = Nothing
            LancerMinuterie()
        End Sub
    Ai-je omis quelquechose ?
    "On peut dire qu’il est possible de savoir comment vaincre sans être capable de le faire" - Sun Tze, in L'art de la guerre

    "Mais t'es complètement naze ou quoi ?! UNE pomme ! ça fait DEUX moitiés de pomme !! mais quand vas-tu le comprendre ?! J'en ai ma claque, j'me tire !" - Bouddha et un disciple, dans un moment de faiblesse

  4. #4
    Nouveau membre du Club Avatar de yoyann
    Inscrit en
    Juillet 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    C'est normal que t'as fenêtre n'est plus rafraichit puisque ton traitement prend le dessus sur l'affichage de ta fenêtre.

    Essaye de mettre un Application.DoEvents(); juste avant l'appel à la methode LancerMinuterie() dans ta methode OnTimedEvent.

    Sinon pour les thread il y a un tuto
    http://emerica.developpez.com/csharp/threads/

  5. #5
    Membre habitué Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Points : 177
    Points
    177
    Par défaut
    Nickel pour l'affichage des éléments des fenêtres de message avec le DoEvents !
    Par contre la fermeture d'un message provoque le plantage du service... (et le curseur n'adopte pas la forme de la flèche)
    C'est sans doute normal d'après ce que tu m'as dit... j'vais tenter un exe à part.
    "On peut dire qu’il est possible de savoir comment vaincre sans être capable de le faire" - Sun Tze, in L'art de la guerre

    "Mais t'es complètement naze ou quoi ?! UNE pomme ! ça fait DEUX moitiés de pomme !! mais quand vas-tu le comprendre ?! J'en ai ma claque, j'me tire !" - Bouddha et un disciple, dans un moment de faiblesse

  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    perso je prefererai tenter avec le multithreading car il me semble que l'utilisation de Form n'est pas très indiqué dans un service
    De plus, l'habitude pour un service est de plutôt utiliser un journal Log
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  7. #7
    Membre habitué Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Points : 177
    Points
    177
    Par défaut
    J'avais déjà des fichiers de log, mais on me demande de faire afficher des messages en plus ! c'est dur la vie de développeur quand on est pas le maitre
    "On peut dire qu’il est possible de savoir comment vaincre sans être capable de le faire" - Sun Tze, in L'art de la guerre

    "Mais t'es complètement naze ou quoi ?! UNE pomme ! ça fait DEUX moitiés de pomme !! mais quand vas-tu le comprendre ?! J'en ai ma claque, j'me tire !" - Bouddha et un disciple, dans un moment de faiblesse

  8. #8
    Nouveau membre du Club Avatar de yoyann
    Inscrit en
    Juillet 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 37
    Points : 29
    Points
    29
    Par défaut
    Pour le crash de ton service il génère quel erreur ?et a quel endroit du code ?
    Cela peut être du que quand tu fermes une fenêtre, l'application essaye d'arreter le service.

    Mais bon normallement les services c'est une application qui fonctionne en fond de taches et dans lequel il n'y a pas d'interface utilisateur.

    Si vraiment tu veut cet interface utilisateur, tu peux te faire une application a par qui est lancé en même temps que ton service et dans ton service tu écrit dans un fichier les logs, et dans ton autre application tu utilises

  9. #9
    Membre habitué Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Points : 177
    Points
    177
    Par défaut
    J'obtiens "Erreur 1067 : le processus s'est arrêté inopinément" (tu m'étonnes ) , mais ce n'est pas systématique, d'habitude je n'ai rien du tout. De plus je n'ai pas la possibilité de fermer certaines fenêtres quand j'en laisse plusieures s'afficher. C'est pas clean du tout.

    Sinon j'ai fait un exe à part ; ça se lance bien, je peux avoir plusieures fenêtres en même temps à l'écran, le service ne s'arrête pas.... mais c'était trop beau pour que ça dure: le service ne peut s'exécuter que sous le compte local, avec l'option "interragir avec le bureau" de cochée. Or le service devra accéder à des répertoires réseau, ce que ne me permet pas le compte local. Et sur les autres comptes (du genre administrateur), on a pas l'option d'interraction avec le bureau...

    Il va donc falloir comme le suggère Neguib que je m'attèle au thread...
    "On peut dire qu’il est possible de savoir comment vaincre sans être capable de le faire" - Sun Tze, in L'art de la guerre

    "Mais t'es complètement naze ou quoi ?! UNE pomme ! ça fait DEUX moitiés de pomme !! mais quand vas-tu le comprendre ?! J'en ai ma claque, j'me tire !" - Bouddha et un disciple, dans un moment de faiblesse

  10. #10
    Membre habitué Avatar de joefou
    Profil pro
    Inscrit en
    Février 2005
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 248
    Points : 177
    Points
    177
    Par défaut
    Ca va beaucoup mieux avec les threads ! voilà ce que j'ai pour gérer des messages:

    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
    38
    39
     
    Imports System.Threading
    Imports System.Windows.Forms
     
    Public Class ThreadHandleMessageService
     
        Private m_Thread As Thread
        Private m_Message As String
     
        '----------------------------
        'Constructeur
        '----------------------------
        Public Sub New()
            m_Message = ""
        End Sub
     
        '-----------------------------------------
        'Afficher un message - Methode du thread
        '-----------------------------------------
        Private Sub ThreadAfficherMessage()
            MessageBox.Show(m_Message, "Service Newac",
     MessageBoxButtons.OK, MessageBoxIcon.Exclamation,
     MessageBoxDefaultButton.Button1,
     MessageBoxOptions.ServiceNotification)
            m_Thread.Suspend()
            m_Thread.Abort()
        End Sub
     
        '-------------------------
        'Afficher un message 
        '-------------------------
        Public Sub Afficher(ByVal Msg As String)
            m_Message = Msg
            m_Thread = New Thread(New ThreadStart(AddressOf 
    ThreadAfficherMessage))
            m_Thread.Start()
        End Sub
     
    End Class
    Je l'utilise ensuite de la façon suivante:

    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
     
    Private Sub OnTimedEvent(ByVal source As Object, ByVal e As
     ElapsedEventArgs) Handles m_Minuterie.Elapsed
            Dim Str As String = " il est " & DateTime.Now.Hour & ":" &
     DateTime.Now.Minute & ":" & DateTime.Now.Second
            Dim MsgThr As New ThreadHandleMessageService
            MsgThr.Afficher(Str)
            fichier = New StreamWriter("c:\partage\TESTSERVICE.txt", True)
            fichier.WriteLine(Str)
            fichier.Flush()
            fichier.Close()
            fichier = Nothing
            Application.DoEvents()
            LancerMinuterie()
        End Sub
    Merci à vous Yoyann et Neguib !
    "On peut dire qu’il est possible de savoir comment vaincre sans être capable de le faire" - Sun Tze, in L'art de la guerre

    "Mais t'es complètement naze ou quoi ?! UNE pomme ! ça fait DEUX moitiés de pomme !! mais quand vas-tu le comprendre ?! J'en ai ma claque, j'me tire !" - Bouddha et un disciple, dans un moment de faiblesse

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

Discussions similaires

  1. [Débutant] En ASP.NET, comment afficher un messagebox avec deux boutons OUI/NON?
    Par ronot dans le forum ASP.NET
    Réponses: 2
    Dernier message: 29/01/2013, 16h29
  2. Réponses: 3
    Dernier message: 24/06/2009, 15h19
  3. Réponses: 15
    Dernier message: 15/10/2006, 23h16
  4. Réponses: 4
    Dernier message: 10/05/2006, 10h36

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