Activé le click ou le rpogramme d'un bouton depuis un timer

Résolu
kakashi68 - 16 mai 2013 à 08:17
cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre 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

11 réponses

cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre Dernière intervention 11 juin 2013 7
16 mai 2013 à 12:27
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é.
3
cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre Dernière intervention 11 juin 2013 7
16 mai 2013 à 13:26
Ç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(); }));
3
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
1
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 ..
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre Dernière intervention 11 juin 2013 7
16 mai 2013 à 09:36
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();
  }
0
cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre Dernière intervention 11 juin 2013 7
16 mai 2013 à 09:46
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.
0
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) .
0
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 ^^
0
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 )
0
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 .
0
cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre Dernière intervention 11 juin 2013 7
16 mai 2013 à 13:39
Pas de soucis. Bonne chance pour la suite
0
Rejoignez-nous