Lancer un process grâce à un timer [Résolu]

Messages postés
13
Date d'inscription
vendredi 10 juillet 2009
Dernière intervention
28 février 2011
- - Dernière réponse : menfoutix
Messages postés
13
Date d'inscription
vendredi 10 juillet 2009
Dernière intervention
28 février 2011
- 2 nov. 2009 à 11:12
Bonjour à tous
je suis débutant en vb net
je suis en train de faire une appli pour lancer une fichier à des heures choisis et des jours choisis pour cela j'utilise 2 textbox pour les heures et minutes et 7 checkbox pour les jours de la semaine
donc l'utilisateur devra valider manuellement les jours et heures/minutes
grâce à une personne j'ai fait ce bout de code mais hélas rien ne se passe lorsque l'heure arrive
je vous met le code si vous pouviez me dire là ou ça coince ça serait sympa merci encore à vous
Public Class Form1
    Public Function GetWeekDayName(ByVal mydate As DateTime) As String
        Return System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames(CType(mydate.DayOfWeek, Integer))
    End Function


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim mydate As DateTime = DateTime.Now
        If cbmonday.Checked = True Then
            If GetWeekDayName(mydate) = "Monday" Then
                Process.Start("C:\Program Files\IDRE Informatique Backup\sauve.bat")
            End If
        End If
        If cbtuesday.Checked = True Then
            If GetWeekDayName(mydate) = "Tuesday" Then
                Process.Start("C:\Program Files\IDRE Informatique Backup\sauve.bat")
            End If
        End If
        If cbWednesday.Checked = True Then
            If GetWeekDayName(mydate) = "Wednesday" Then
                Process.Start("C:\memo.txt")
            End If
        End If
        If cbthursday.Checked = True Then
            If GetWeekDayName(mydate) = "Thursday" Then
                MessageBox.Show("bonjour")
            End If
        End If
        If cbfriday.Checked = True Then
            If GetWeekDayName(mydate) = "Friday" Then
                Process.Start("C:\memo.txt")
            End If
        End If
        If cbsaturday.Checked = True Then
            If GetWeekDayName(mydate) = "Saturday" Then
                Process.Start("C:\memo.txt")
            End If
        End If
        If cbsunday.Checked = True Then
            If GetWeekDayName(mydate) = "Sunday" Then
                Process.Start("C:\memo.txt")
            End If
        End If
        If String.IsNullOrEmpty(tbheure.Text) Then
            If mydate.Hour = Int32.Parse(tbheure.Text) Then
                Process.Start("C:\memo.txt")
            End If
        End If
        If String.IsNullOrEmpty(tbminute.Text) Then
            If mydate.Minute = Int32.Parse(tbminute.Text) Then
                Process.Start("C:\memo.txt")
            End If
        End If
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Timer1.Interval = 60000
        Timer1.Start()
    End Sub
End Class

Merci beaucoup de votre aide je cherche depuis un long moment je parcours le net de long en large mais je vois pas
Afficher la suite 

Votre réponse

14 réponses

Meilleure réponse
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Dernière intervention
13 décembre 2009
3
Merci
Oui, c'est normal. Et quand une heure et une minute seront saisient aussi et que le système sera au jour, l'heure et la minute choisient, tu en aura trois en même temps.

D'abords ce qu'il te faut c'est mieux connaitre les bases de la logique binaire qui est la base de tout test logique. Il serait bon pour toi de jeter un oeil, en faisant une recherche sur Internet par exemple, sur l'algèbre de Boole et les tableaux de Karnaugh entre autre, même de façon succinte.

Pour résumer :
tu as deux fonctions principales : ET et OU (AND et OR)
et une fonction qui renvoie le complément : NON (NOT)
les complément NON ET et NON OU sont souvent notés NAND et NOR.

Voilà les tableaux correspondant, S étant le résultat et A et B, deux résultats de tests à combiner. On admet, dans notre cas, que 0 signifie FAUX et 1, VRAI:

AND
A B AND OR NAND NOR
0 0 0 0 1 1
0 1 0 1 1 0
1 0 0 1 1 0
1 1 1 1 0 0

Tu peux remarquer que pour AND le résultat n'est VRAI que si le TEST A ET le TEST B sont VRAIs et que pour OR, le résultat est VRAI si le TEST A OU le TEST B sont VRAIs.

---------------------------------------------------------

Ceci étant dis, quel est ton problème ?
Une action particulière doit être éffectué un jour dit à une heure choisie.

Quelles sont les conditions à prendre en compte ?

1. Si l'heure ET les minutes NE SONT PAS définies, on ne fait rien. Qui devient : On éffectue l'action que SI l'heure ET les minutes NE SONT PAS vides. Soit, en VB dans ton programme :

If Not (String.IsNullOrEmpty(tbheure.Text) AND String.IsNullOrEmpty(tbminute.Text)) Then ...


Note les parenthèses qui entourent le test AND ! pour que NOT inverse le résultat de cette opération.

2. Si le jour n'est pas le jour actuel, ne rien faire. Même si l'heure correspond.
Ca on à déjà résolu.

Voilà, suivant ces bases, une proposition de résolution (mais pas l'unique, ni la meilleur. juste une solution):

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

  Dim mydate As DateTime = DateTime.Now
  Dim MyDateDayName As DayOfWeek = mydate.DayOfWeek
  Dim MyDateHour As String = mydate.ToShortTimeString() '-- Une string de l'heure sous forme 01:00
  Dim Go As Boolean = False

  If Not (String.IsNullOrEmpty(tbheure.Text) AND String.IsNullOrEmpty(tbminute.Text)) Then
      
      Dim SelectedHour As String = tbheure.Text & ":" & tbminute.Text
      If SelectedHour = MyDateHour Then

          Select Case MyDateDayName

            Case DayOfWeek.Monday
              If cbmonday.Checked True Then Go True

            Case DayOfWeek.Tuesday
              If cbtuesday.Checked True Then Go True

            Case etc...

          End Select

      End If

  End IF

  If Go Then Process.Start("C:\Program Files\IDRE Informatique Backup\sauve.bat")

End Sub


On peut aussi simplifier en faisant :
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

  Dim mydate As DateTime = DateTime.Now
  Dim MyDateDayName As DayOfWeek = mydate.DayOfWeek
  Dim Go As Boolean = False

  If tbheure.Text & ":" & tbminute.Text = mydate.ToShortTimeString() Then

        Select Case MyDateDayName

          Case DayOfWeek.Monday
            Go = cbmonday.Checked

          Case DayOfWeek.Tuesday
            Go = cbtuesday.Checked

          Case etc...

        End Select

  End IF

  If Go Then Process.Start("C:\Program Files\IDRE Informatique Backup\sauve.bat")

End Sub


Je te laisse analyser.
A+

Merci cs_Ayr 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_Ayr
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Dernière intervention
13 décembre 2009
3
Merci
Désolé pour le tableau de Karnaugh qui est mal présenté (pas très lisible). et le premier AND sur la ligne de dessus est à enlever. Mais tu trouvera de meilleurs présentations sur Internet.

Merci cs_Ayr 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_Ayr
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Dernière intervention
13 décembre 2009
3
Merci
Petite correction sur l'analyse du problème... L'action est à effectuer si une heure est choisie et un ou plusieurs jours sont sélectionnés. Ce qui ne change rien au code de la méthode Timer1_Tick.

Une suggestion peut être serait de désactiver le timer quand il n'y à pas d'heure ou de minute et le réactiver quand une heure et une minute sont choisies, ainsi qu'au moins un jour coché. Ce qui évite de faire tourner un timer pour rien. Même si dans ce cas, il n'y à aucun interet à lancer le programme... mais plus propre.

Dans le cas ou ton programme tourne en permanance en tâche de fond, tu peut utiliser la classe NotifyIcon pour ne pas encombrer ta barre des tâches. Jète un oeil dans la boite à outils

Merci cs_Ayr 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_Ayr
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Dernière intervention
13 décembre 2009
3
Merci
Merci à toi pour toute ces explications j'apprends beaucoup de chose

j'essaie de passer à une étape supérieure de la programmation j'ai pas mal de livres sur vb net mais ça reste surtout les bases et hélas rien de ne parle de plus approfondi même si je sais qu'on doit savoir les bases comme il faut pour aller plus loin.
heureusement qu'il y a des sites comme vbfrance pour aider les aider les débutants et des gens aussi sympa pour aider


Hé bien, c'est le but et je suis bien d'accord avec toi en ce qui concerne vbfrance et l'ensemble des sites Codes-Sources ! Cette communauté m'a beaucoup apporté même sans que je pose de questions . C'est une mine et comme dans toutes mines il faut creuser mais par contre, dans celle-ci, on y trouve souvent des pépites !

Merci cs_Ayr 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_Ayr
Messages postés
13
Date d'inscription
vendredi 10 juillet 2009
Dernière intervention
28 février 2011
0
Merci
j'ai pas moyen d'éditer mon premier message pour les chemins ou se trouve le fichier se sont des fichiers de test j'ai même essayer un faisant un messagebox et même lui ne se lance pas
Commenter la réponse de menfoutix
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Dernière intervention
13 décembre 2009
0
Merci
Salut,

Une chose que tu dois faire systématiquement quand ça ne marche pas c'est visualiser le contenu de tes variables. Par exemple, tu compare GetWeekDayName(mydate) avec une string, par exemple "Saturday". Mais si tu regarde le retour de ta fonction GetWeekDayName(mydate) tu verra que si on est samedi, elle te retourne... "samedi". Donc si tu compare avec "Saturday"... je te laisse deviner.

La fonction GetWeekDayName renvois un jour de la semaine en fonction de la culture du systeme où elle s'execute. Soit pour toi peut être le français non ?

Si tu veux garder le test avec les jour en anglais au cas où le programme doit tourner sur des cultures différents utilise DateTime.Now.DayOfWeek.ToString. Dans ton programme ça donnerai:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  Dim mydate As DateTime = DateTime.Now
  Dim MyDateDayName As String = mydate.DayOfWeek.ToString()
  If cbmonday.Checked = True Then
      If MyDateDayName = "Monday" Then
          Process.Start("C:\Program Files\IDRE Informatique Backup\sauve.bat")
      End If
  End If
  etc...


Deuxième problème pour les heures et les minutes: "If String.IsNullOrEmpty(tbminute.Text)" veux dire : Si tbminute.Text est null ou vide... et toi ce que tu veux c'est: si tbminute.Text n'est pas null ou n'est pas vide... tu vois le problème là aussi ?

A+ et bon courage
Commenter la réponse de cs_Ayr
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Dernière intervention
13 décembre 2009
0
Merci
PS: pour les jours de la semaine, tu peux aussi écrire:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

  Dim mydate As DateTime = DateTime.Now
  Dim MyDateDayName As DayOfWeek = mydate.DayOfWeek

  If cbmonday.Checked = True Then
      If MyDateDayName = DayOfWeek.Monday Then
          Process.Start("C:\Program Files\IDRE Informatique Backup\sauve.bat")
      End If
  End If
  etc...


Plus de guillemets, dans ce cas Monday est un membre de l'énumération DayOfWeek.
Commenter la réponse de cs_Ayr
Messages postés
13
Date d'inscription
vendredi 10 juillet 2009
Dernière intervention
28 février 2011
0
Merci
Merci à toi de m'aider Ayr
j'ai utilisé la deuxième solution
j'ai enlevé les lignes pour l'heure et minute et la lorsque je lance mon appli et que je coche la date d'aujourd'hui il me lance bien le fichier de test toute les minutes (normale vu que je tick mon timer toute les minutes) et si je décoche la date il se passe plus rien
Merci à toi j'ai au moins avancé dans un sens

effectivement pour l'heure et minute je veux voir si effectivement mes textbox ne sont pas vide je vois le soucis
mon problème là c'est que je ne connais pas comment lui faire voir que mon textbox correspond à l'heure et minute entre mon heure system et mes textbox

un grand merci à toi déjà ça permet d'avancer car depuis un moment que je cherche
Commenter la réponse de menfoutix
Messages postés
221
Date d'inscription
mercredi 9 avril 2003
Dernière intervention
13 décembre 2009
0
Merci
Il y à un mot clef qui sert à inverser un résultat booléen. C'est "Not". Et la Fonction "String.IsNullOrEmpty" retourne un booléen.

Tu peux donc écrire "If Not String.IsNullOrEmpty(tbheure.Text) Then ..."

Un petit mot pour tes tests multiples sur les jours: Il y à une façon de les écrires plus clairement (je pense) et il semble avec une vitesse accrue d'execution, c'est en utilisant la structure Select Case. Ca donnerai pour toi:

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

  Dim mydate As DateTime = DateTime.Now
  Dim MyDateDayName As DayOfWeek = mydate.DayOfWeek

  Select Case MyDateDayName

    Case DayOfWeek.Monday
      If cbmonday.Checked = True Then Process.Start("C:\Program Files\IDRE Informatique Backup\sauve.bat")

    Case DayOfWeek.Tuesday
      If cbtuesday.Checked = True Then Process.Start("C:\Program Files\IDRE Informatique Backup\sauve.bat")

    Case etc...

  End Select

    etc...
Commenter la réponse de cs_Ayr
Messages postés
13
Date d'inscription
vendredi 10 juillet 2009
Dernière intervention
28 février 2011
0
Merci
merci pour tes conseils
j'ai mis
not
là ou tu dis et il me
tick
toutes les minutes et en plus il me lance 2 fois le fichier test
Commenter la réponse de menfoutix
Messages postés
13
Date d'inscription
vendredi 10 juillet 2009
Dernière intervention
28 février 2011
0
Merci
Bon j'ai trouvé pourquoi il me lancé 2 fois le fichier car je mettais 2 fois l'appel du fichier 1 fois pour l'heure et minute et 1 fois pour le jour
donc j'ai changé le code j'ai mis ça à la place
 If Not String.IsNullOrEmpty(tbheure.Text) Then
            If mydate.Hour = Int32.Parse(tbheure.Text) Then
                If Not String.IsNullOrEmpty(tbminute.Text) Then
                    If mydate.Minute = Int32.Parse(tbminute.Text) Then
                    End If
                End If
                If cbmonday.Checked = True Then
                    If MyDateDayName = DayOfWeek.Monday Then
                        Process.Start("C:\memo.txt")
                    End If
                End If
etc....


par contre j'ai l'impression que le timer ne regarde pas l'heure et les minutes mise dans les textbox car il tick dès que je coche le jour voulu et en plus il m'ouvre les fichier toutes les minutes sans se soucier de l'heure car il tick avant et après l'heure passé
Commenter la réponse de menfoutix
Messages postés
13
Date d'inscription
vendredi 10 juillet 2009
Dernière intervention
28 février 2011
0
Merci
j'ai mis le code avec Select Case c'est vrai c'est plus claire par contre toujours même souci le timer tick toute les minutes et ouvre autant de fichier
Commenter la réponse de menfoutix
Messages postés
13
Date d'inscription
vendredi 10 juillet 2009
Dernière intervention
28 février 2011
0
Merci
Merci à toi pour toute ces explications j'apprends beaucoup de chose

j'essaie de passer à une étape supérieure de la programmation j'ai pas mal de livres sur vb net mais ça reste surtout les bases et hélas rien de ne parle de plus approfondi même si je sais qu'on doit savoir les bases comme il faut pour aller plus loin.
heureusement qu'il y a des sites comme vbfrance pour aider les aider les débutants et des gens aussi sympa pour aider.

mon but de mon programme c'est de faire comme une "sauvegarde automatique" le but c'est que j'ai besoin de pouvoir lancer un fichier à une heure et jour choisi par l'utilisateur je peux pas utiliser la tâche planifier de windows car d'autre chose vont venir se greffer dans mon appli .

donc le but et j'ai bien compris c'est en effet qu'il y a des conditions pour lancer mon fichier
c'est si une heure et choisit et si une journée voir plus et choisit aussi donc dans ce cas le timer peux se lancer

effectivement j'ai déjà mis en place un bouton qui me permet de lancer ou de stopper le timer si il a besoin d'être actif ou pas
mais vu que j'avais des soucis je l'ai enlever pour le mettre directement dans le load pour les test

pour le NotifyIcon oui ça y est j'en ai fait aussi c'est vachement bien

bon je vais essayer tout ça et je te tiens au courant

en tout cas merci encore pour ton aide précieuse
Commenter la réponse de menfoutix
Messages postés
13
Date d'inscription
vendredi 10 juillet 2009
Dernière intervention
28 février 2011
0
Merci
Merci à toi

ça marche impeccable je vais tester ça plus approfondi mais là ça fonctionne
en si peu de ligne alors que moi je cherchais compliqué
je ne sais comme te remercier j'espère que ça aidera d'autres personnes aussi
je vais pouvoir mettre "réponse acceptée"
Merci beaucoup de ton aide
et je vais pouvoir continuer à développer mon appli.

c'est vrai qu'il y a beaucoup de chose sur le forum faut juste savoir comment s'en servir

Merci
Commenter la réponse de menfoutix

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.