Activé le click ou le rpogramme d'un bouton depuis un timer [Résolu]

- 16 mai 2013 à 08:17 - Dernière réponse :
Messages postés
224
Date d'inscription
vendredi 26 novembre 2010
Dernière intervention
11 juin 2013
- 16 mai 2013 à 13:39
Bonjour

Donc casiment tout est dans le titre :

Je cherche a executer le programme d'un bouton tout les 20 seconde ( temps sera défini par l'utilisateur).
Donc j'aimerai savoir si c'est possible d'executer le code d'un bouton ou d'effectuer le clik sur le bouton automatiquement ?

cordiallement kakashi
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
224
Date d'inscription
vendredi 26 novembre 2010
Dernière intervention
11 juin 2013
- 16 mai 2013 à 12:27
3
Merci
Je pense qu'il faut sue tu mettes le code qui est dans ton Main à la suite de InitializeComponent(); dans public Form1().
As mon avis l'erreur apparaît car ton clic bouton est appelé alors que la méthode main n'a pas été exécutée et donc du coup le timer n'a pas été instancié.

Merci cs_L0ci 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de cs_L0ci
Meilleure réponse
Messages postés
224
Date d'inscription
vendredi 26 novembre 2010
Dernière intervention
11 juin 2013
- 16 mai 2013 à 13:26
3
Merci
Ça n'est pas très surprenant. Tout ce qui concerne l'interface est géré par le thread principal. Comme la tu es dans un thread secondaire, tu n'as pas le droit d’accéder directement à des méthodes du thread principal (ici ton bouton clic).

Du coup tu as 2 méthodes pour corriger le problème:
- Déplacer le code de ton bouton dans une méthode séparée (comme suggéré dans mon 1er post) et appeler cette méthode au lieu du bouton.PerformClick

- Utiliser les delegate et transformer button3.PerformClick(); par
this.Invoke(new Action(() => { button3.PerformClick(); }));

Merci cs_L0ci 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de cs_L0ci
- 16 mai 2013 à 09:41
1
Merci
Rebonjour

voici le timer et l'evenement :
 void Main(string[] args)
        {   
            Clock = new System.Timers.Timer();
            Clock.Elapsed += new ElapsedEventHandler(Clock_Elapsed);
            Clock.Interval = Convert.ToDouble(textBox3.Text);
            Clock.Enabled = false;
            Clock.AutoReset = false;         
        }

        void Clock_Elapsed(object sender, ElapsedEventArgs e)
        {
            Clock.Stop();
            if (code == "READBYTE")
            {
                button3.PerformClick();
            }
            Clock.Start();
        }


et ceci ce trouve dans le code du bouton :
                    if (radioButton2.Checked == true )
                    {
                        Clock.Enabled = !Clock.Enabled;
                    }

Cependant j'ai chaque fois l'erreur "La référence d'objet n'est pas définie à une instance d'objet .." sur la ligne clock.enabled .
Quelqu'un pourait m'aider a enlevé cette erreur svp
Commenter la réponse de kakashi68
- 16 mai 2013 à 11:33
1
Merci
voila mon code un peu modifier mais toujours la meme erreur quant a la mise en route du timer:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;// for using sw
using System.Net.NetworkInformation;// for using ping
using System.Runtime.InteropServices; // use with libnodave
using System.Timers;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }
        static libnodave.daveOSserialType fds;
        static libnodave.daveInterface di;
        static libnodave.daveConnection dc;
        public static System.Timers.Timer Clock;


        void Main(string[] args)
        {   
            Clock = new System.Timers.Timer();
            Clock.Elapsed += new ElapsedEventHandler(Clock_Elapsed);
            Clock.Interval = Convert.ToDouble(textBox3.Text);
            Clock.Enabled = false;
            Clock.AutoReset = false;         
        }

        void Clock_Elapsed(object sender, ElapsedEventArgs e)
        {
            Clock.Stop();
            if (checkBox1.Checked == true )
                button3.PerformClick();
            if (checkBox2.Checked == true)
                button5.PerformClick();
            if (checkBox3.Checked == true)
                button6.PerformClick();
            Clock.Start();
        }

je vous épargne tout les bouttons
        void button7_Click(object sender, EventArgs e)
        {
            Clock.Enabled = true;
        }

        void button8_Click(object sender, EventArgs e)
        {
            Clock.Enabled = false;
        }



    }
}

Voila donc a chaque ligne true et false sa me met une erreur ..
Commenter la réponse de kakashi68
Messages postés
224
Date d'inscription
vendredi 26 novembre 2010
Dernière intervention
11 juin 2013
- 16 mai 2013 à 09:36
0
Merci
Bonjour,

Pour que cela fonctionne il ne faut pas que tu codes la fonction que tu souhaites appeler dans le click de ton bouton.
Il faut que ton click de bouton et ton timer.Tick fassent appel à la même fonction. L'algo en gros (je n'ai pas vs sous la main)
  private void MaFonction(){
     //code de la fonction que tu veux appeler
  }
 
  //fonction appelée par le timer
  Timer_tick(){
    MaFonction();
  }

  //fonction appelée par le bouton
  Button_click(){
    MaFonction();
  }

ou alors si tu veux que le timer soit déclenché par ron bouton
  private void MaFonction(){
     //code de la fonction que tu veux appeler
  }
 
  //fonction appelée par le timer
  Timer_tick(){
    MaFonction();
  }

  //timer démarré par le bouton
  Button_click(){
    timer.start();
  }
Commenter la réponse de cs_L0ci
Messages postés
224
Date d'inscription
vendredi 26 novembre 2010
Dernière intervention
11 juin 2013
- 16 mai 2013 à 09:46
0
Merci
Salut,

Est que ton objet Clock est bien défini dans la class qui contient ce code
 if (radioButton2.Checked == true )
                    {
                        Clock.Enabled = !Clock.Enabled;
                    }

Si tu n'es pas sur poste le code de cette class.
Commenter la réponse de cs_L0ci
- 16 mai 2013 à 09:50
0
Merci
Merci d'avoir répondu Loci
Par contre j'ai un code dans mon bouton , aui sert a lire des byte sur un automate une fois , cependant je dois pouvoir effectuer se code a un temps defini, donc j'ai eu l'idée de créé un reclickage du bouton toute les 20s par exemple .
Car le code de mon bouton fait au moins 50 ligne et j'ai trois bouton différents (pour les byte , bit et mot) .
Commenter la réponse de kakashi68
- 16 mai 2013 à 09:57
0
Merci
J'ai tout poster les rest du bouton marchait avant , dans le void main je déclare clock , a moins que j'ai tout faux ^^
Commenter la réponse de kakashi68
- 16 mai 2013 à 12:43
0
Merci
Niquel merci beaucoup ! t'assure !

Mais j'ai une autre erreur encore :
void Clock_Elapsed(object sender, ElapsedEventArgs e)
        {
            Clock.Stop();
            if (checkBox1.Checked == true )
                button3.PerformClick();
            if (checkBox2.Checked == true)
                button5.PerformClick();
            if (checkBox3.Checked == true)
                button6.PerformClick();
            Clock.Start();
        }

sur le button 3.PerformClick il y a l'erreur : Invalide Opération inter-threads: l'accès à la button3 contrôle était d'un autre thread que le thread sur lequel il a été créé.( Traduis de l'allemand )
Commenter la réponse de kakashi68
- 16 mai 2013 à 13:38
0
Merci
J'ai utilisé la deuxieme méthode . Merci beaucoup de ton aide ! tu ma permis de finir la premiere partie de mon sujet de stage .
Commenter la réponse de kakashi68
Messages postés
224
Date d'inscription
vendredi 26 novembre 2010
Dernière intervention
11 juin 2013
- 16 mai 2013 à 13:39
0
Merci
Pas de soucis. Bonne chance pour la suite
Commenter la réponse de cs_L0ci

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.