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

Interfaces Graphiques Discussion :

Utilisation de plusieurs Timer Error


Sujet :

Interfaces Graphiques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut Utilisation de plusieurs Timer Error
    Bonjour à tous,

    J'ai un problème de démarrage de Timer. Je pensais avoir résolu mon problème avec ce que j'ai posté ici mais finalement, non.

    J'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Error while evaluating TimerFcn for timer 'timer-5' 
     
    Attempt to reference field of non-structure array.
    Dans ma fonction principale, je déclare les timers suivants :
    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
    %% Periode des Timers
    % graphique
    per_graph = 1;
    % save acc
    per_acc = 0.5;                 
    % save data acc
    per_data_acc = 30;
     
    %% pour mettre à jour le graphique
    guit.timer_graph = timer(...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', per_graph, ...                % Initial period is per_graph sec.
        'TimerFcn', @Update_Display);           % Specify callback function
     
    %% declaration du timer pour acquerir les donnees de l'accelero
    guit.timer_acc = timer(...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', per_acc, ...                  % Initial period is per_acc sec.
        'TimerFcn', @Acq_Acc);                 % Specify callback function
     
    %% declaration du timer pour enregistrer les donnees de l'accelero de manière automatique
    guit.timer_auto_save_acc = timer(...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', per_data_acc, ...             % Initial period is per_data_acc sec.
        'TimerFcn', @Auto_Save_Data_Acc);       % Specify callback function
     
    %% declaration du timer pour connaitre le temps restant
    guit.timer_tps_restant=timer(...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', 1, ...                        % Initial period is 1 sec.
        'TimerFcn', @Tps_Restant);              % Specify callback function
    Puis, dans une fonction imbriquée, je veux démarrer/arrêter deux de ces timers suite à l'action sur un togglebutton. D'un point de vue théorique, je devrais faire juste ceci :

    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
    function Acc_Data(obj,event)
            if strcmp(get(gui.acc_data,'String'),'DATA ACCELERO')               % si il est affiche "DATA ACCELERO" sur l'interrupteur 
                % on met a jour l'interface
                set(gui.acc_data,'String','ACQUISITION');                       % on change le nom inscrit sur l'interrupteur pour indiquer l'acquistion
                % on déclenche les timers
                start(guit.timer_graph);                                         % on lance le timer pour raffraichir les graphiques
                start(guit.timer_acc);                                           % on lance le timer pour aller lire les donnes de le buffer du port serie
            else
                % on met à jour l'interface
                set(gui.acc_data,'String','DATA ACCELERO');                     % on change le nom inscrit sur l'interrupteur pour indiquer son etat de repos
                % on arrete les timers
                stop(guit.timer_graph);                                          % on arrete le timer lie au graphique
                stop(guit.timer_acc);                                            % on arrete le timer lie a la lecture du buffer du port serie
            end
        end
    Or, ça ne déclenche qu'un des timers sur les deux. Alors, j'ai fait du bricolage comme ceci dans cette fonction :
    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
          function Acc_Data(obj,event)
            guit=getappdata(hgui,'handguit');
            if strcmp(get(gui.acc_data,'String'),'DATA ACCELERO')               % si il est affiche "DATA ACCELERO" sur l'interrupteur 
                % on met a jour l'interface
                set(gui.acc_data,'String','ACQUISITION');                       % on change le nom inscrit sur l'interrupteur pour indiquer l'acquistion
                % on déclenche les timers
                start(guit.timer_graph);                                        % on lance le timer pour raffraichir les graphiques
                % on s'assure que les timers sont lancés
                if strcmp(get(guit.timer_graph,'Running'),'off')                % si le timer n'est pas lance
                    delete(guit.timer_graph)                                    % on efface le handle du timer
                    guit.timer_graph = timer(...                                % on le redefinit
                        'ExecutionMode', 'fixedRate', ...
                        'Period', per_graph, ...         
                        'TimerFcn', @Update_Display);    
                    start(guit.timer_graph);                                    % on le relance
                end
                start(guit.timer_acc);                                          % on lance le timer pour aller lire les donnes de le buffer du port serie
                if strcmp(get(guit.timer_acc,'Running'),'off')                  % si le timer n'est pas lance
                    delete(guit.timer_acc)                                      % on efface le handle du timer
                    guit.timer_acc = timer(...                                  % on le redefinit
                        'ExecutionMode', 'fixedRate', ...     
                        'Period', per_acc, ...                
                        'TimerFcn', @Acq_Acc);                
                    start(guit.timer_acc);                                      % on le relance
                end
            else
                % on met à jour l'interface
                set(gui.acc_data,'String','DATA ACCELERO');                     % on change le nom inscrit sur l'interrupteur pour indiquer son etat de repos
                % on arrete les timers
                stop(guit.timer_graph);                                         % on arrete le timer lie au graphique
                stop(guit.timer_acc);                                           % on arrete le timer lie a la lecture du buffer du port serie
                %on s'assure que les timers sont bien stopes
                while strcmp(get(guit.timer_acc,'Running'),'on')                % tant que le timer n'est pas arrete alors
                    stop(guit.timer_acc);                                       %   on lui demande de stopper
                end
                while strcmp(get(guit.timer_graph,'Running'),'on')              % idem pour le deuxieme timer
                    stop(guit.timer_graph);                                     %   on lui demande de stopper
                end
            end
        end
    Ca ne suffit toujours pas...

    Alors, au début de chaque fonction callback de chaque timer, je lui redemande de lancer son "frère" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if strcmp(get(guit.timer_acc,'Running'),'off')                  % si le timer n'est pas lance
         delete(guit.timer_acc)                                      % on efface le handle du timer
        guit.timer_acc = timer(...                                  % on le redefinit
            'ExecutionMode', 'fixedRate', ...     
            'Period', per_acc, ...                
            'TimerFcn', @Acq_Acc);                
        start(guit.timer_acc);                                      % on le relance
    end
    Et là, de manière ambiguë, il arrive au bout de quelques secondes à me lancer le "frère" qui ne s'était pas lancé jusqu'à maintenant.

    Sans la communication avec le port série, je n'ai pas rencontré ce problème.
    Je me demande si je ne devrais pas lancer les timers avant de me connecter au port série pour m'assurer de leur lancement...

    Ca semblait si joli de faire du timer plutôt que des "while", "tic" et "toc"...

    Si vous avez des propositions, je suis preneur.

    Cordialement,

    Christophe

  2. #2
    Membre émérite Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Par défaut
    salut
    une première réponse rapide :
    1. je vois que tu n'as pas spécifié la propriété 'TasksToExecute' que je crois indispensable (1 par défaut - à vérifier)
    2. essaye peut-être de passer la propriété 'BusyMode' à 'queue' ('drop' par défaut)

    suivre notamment le lien 'Timer Execution Modes' puis le lien pour la page 'Executing a Timer Callback Function Multiple Times'

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Merci pour les infos.

    la propriété 'TasksToExecute' est à défaut "inf".

    Je teste ça.

    Chirstophe

  4. #4
    Membre émérite Avatar de tubaas
    Homme Profil pro
    Acousticien
    Inscrit en
    Août 2009
    Messages
    641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Par défaut
    Citation Envoyé par christophe_halgand Voir le message
    la propriété 'TasksToExecute' est à défaut "inf"
    ça me semblait étrange aussi que tu n'aies rien remarqué si ça ne s'exécutait qu'une fois. Par contre attention, cela doit dépendre des versions de Matlab (dans les versions que j'ai utilisées de mémoire c'était toujours 1).

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Ok, je suis malheureusement toujours bloqué.

    J'ai donc voulu reprendre les choses à plat en utilisant deux "timers" bêtes et méchants. Le comportement est vraiment bizarre...

    Si on exécute un "START", un seul timer se met en route. En appuyant ensuite sur "STOP", on met le second "timer" en route . Si on appuie de nouveau sur START, on a enfin les deux timers comme on le voudrait avec un simple clic sur "START" :dry: .

    Si on fait la suite "START", "STOP" et encore "STOP", on arrête les deux timers...

    J'ai un peu de mal à avaler ça... Une explication logique ?

    Tout ce que je comprends c'est qu'il faut deux fois "STOP" pour arrêter les timers sachant qu'il aurait dû me dire peut-être qu'un des timer était déjà arrêté. Et quand on fait deux fois "START", il me dit qu'un des timers est déjà en route et qu'il ne peut donc pas être réactivé...

    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
    105
    106
    107
    108
    109
    function gui_USE_TIMER3
     
    clear all
    close all
    clc
     
    x2=1;
    y2=1;
     
    scrsz = get(0,'ScreenSize');
     
    % Création de l'objet Figure
    hgui=figure('units','pixels',...
        'Position',[scrsz(1) scrsz(2) scrsz(3) scrsz(4)],...
        'color',[0.925 0.913 0.687],...
        'numbertitle','off',...
        'name','[GUI] Interface avec le microcontroleur',...
        'menubar','none',...
        'tag','interface');
     
                                                 %%%%%%%%%%%%%
    % Création de l'objet Uicontrol Pushbutton   %%% START %%%
    gui.start=uicontrol('style','pushbutton',... %%%%%%%%%%%%%
        'BackgroundColor','g',...
        'units','normalized',...
        'position',[0.1 0.825 0.1 0.05],...
        'FontSize',14,...
        'FontWeight','bold',...
        'string','START',...
        'callback',@bouton_start);
     
                                                %%%%%%%%%%%%
    % Création de l'objet Uicontrol Pushbutton  %%% STOP %%%
    gui.stop=uicontrol('style','pushbutton',... %%%%%%%%%%%%
        'BackgroundColor','g',...
        'units','normalized',...
        'position',[0.3 0.825 0.1 0.05],...
        'FontSize',14,...
        'FontWeight','bold',...
        'string','STOP',...
        'callback',@bouton_stop);
     
     
    %% affichage graphique de la tension et de l'accélération
     
    % Création de l'objet Axes pour le tracer des tensions
    gui.h1=axes('units','normalized',...
        'position',[0.1 0.4 0.8 0.25]);
     
     
    %% declaration du timer pour mettre à jour le graph tension
    gui.timer_graph1 = timer(...
        'BusyMode','queue',...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', 0.01, ...               % Initial period is per_graph1.
        'TimerFcn', @update_display1);          % Specify callback function
     
    %% declaration du timer pour mettre à jour le graph tension
    gui.timer_xy = timer(...
        'BusyMode','queue',...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', 0.09, ...               % Initial period is per_graph1.
        'TimerFcn', @calc_xy);          % Specify callback function
     
    %% FIN DE LA FONCTION PRINCIPALE
     
     
    % DEBUT DE LA SOUS-FONCTION Bouton_Start %
        function bouton_start(obj,event)
            set(gui.start,'BackgroundColor','r');
            start(gui.timer_graph1);
            start(gui.timer_xy);
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Bouton_Start %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    % DEBUT DE LA SOUS-FONCTION Bouton_Stop %
        function bouton_stop(obj,event)
            set(gui.stop,'BackgroundColor','r');
            stop(gui.timer_xy);
            stop(gui.timer_graph1);
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Bouton_Stop %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
     
    % DEBUT DE LA SOUS-FONCTION Affichage_XY %
        function update_display1(obj,event)
            disp('0000000000000000')
            plot(gui.h1,x2,y2,'*');
            drawnow;
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Affichage XY%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    % DEBUT DE LA SOUS-FONCTION Calcul_XY %
        function calc_xy(obj,event)
            disp('-----------------')
            x2=[x2 rand];
            y2=[y2 rand];
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Affichage XY%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    end

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 769
    Par défaut
    Je pense avoir une piste...

    En fonction de l'ordre de déclaration principalement et de la grandeur du timer...

    J'ai donc, repris mon code, en inversant, les "start" et aussi en inversant les périodes.

    Le meilleur cas est quand je déclare les timers dans l'ordre croissant des périodes (comme c'est initialisé dans le code ci-dessous) ET que je start les timers dans l'ordre inverse de leur déclaration (comme c'est dans le programme principal du code ci-dessous).

    Un cas un peu moins bon qui ne pose un problème que lors des premières interruptions c'est : lorsque les périodes des timers sont inversées. Cocher seulement la checkbox "inv_periode_timer" et vous pourrez voir en faisant un start et stop rapidement que les premières interruptions n'étaient que pour le timer le plus rapide puis le timer le plus lent apparait.

    Finalement, le cas par défaut et qui est le cas posté précédemment, si on start le timer déclarer en premier puis le timer déclarer en second, c'est la jungle...
    Je pense que l'arrêt du premier timer a permis au second de démarrer (due certainement à l'option 'BusyMode','queue') et que le temps d'exécution du stop de ce deuxième timer est plus rapide que la mise en route.
    On a ainsi un démarrage de timer sur le bouton stop... trop fort...

    Bref, voici mon code et amusez vous bien... :$

    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
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    function gui_USE_TIMER_4
     
    clear all
    close all
    clc
     
    x2=1;
    y2=1;
     
    scrsz = get(0,'ScreenSize');
     
    % Création de l'objet Figure
    hgui=figure('units','pixels',...
        'Position',[scrsz(1) scrsz(2) scrsz(3) scrsz(4)],...
        'color',[0.925 0.913 0.687],...
        'numbertitle','off',...
        'name','[GUI] Interface avec le microcontroleur',...
        'menubar','none',...
        'tag','interface');
     
    %                                               %%%%%%%%%%%%%
    % Création de l'objet Uicontrol Pushbutton      %%% START %%%
    gui.start1=uicontrol('style','pushbutton',...   %%%%%%%%%%%%%
        'BackgroundColor','g',...
        'units','normalized',...
        'position',[0.1 0.825 0.1 0.05],...
        'FontSize',14,...
        'FontWeight','bold',...
        'string','START1',...
        'callback',@bouton_start1);
     
     
    %                                           %%%%%%%%%%%%
    % Création de l'objet Uicontrol Pushbutton  %%% STOP %%%
    gui.stop=uicontrol('style','pushbutton',... %%%%%%%%%%%%
        'BackgroundColor','g',...
        'units','normalized',...
        'position',[0.3 0.825 0.1 0.05],...
        'FontSize',14,...
        'FontWeight','bold',...
        'string','STOP',...
        'callback',@bouton_stop);
     
    gui.sens_timer=uicontrol('style','checkbox',...
        'units','normalized',...
        'position',[0.5 0.775 0.7 0.15],...
        'FontSize',14,...
        'FontWeight','bold',...
        'string','Inv_sens_start(timer)');
     
    gui.inv_perio=uicontrol('style','checkbox',...
        'units','normalized',...
        'position',[0.7 0.775 0.7 0.15],...
        'FontSize',14,...
        'FontWeight','bold',...
        'string','Inv_periode_timer');
     
     
    %% affichage graphique de la tension et de l'accélération
     
    % Création de l'objet Axes pour le tracer des tensions
    gui.h1=axes('units','normalized',...
        'position',[0.1 0.4 0.8 0.25]);
     
    period_timer_graph1=0.01;
    period_timer_xy=0.09;
     
    %% declaration du timer pour mettre à jour le graph tension
    gui.timer_graph1 = timer(...
        'BusyMode','queue',...
        'ExecutionMode', 'fixedRate', ...       % Run timer repeatedly
        'Period', period_timer_graph1, ...               % Initial period is per_graph1.
        'TimerFcn', @update_display1);          % Specify callback function
     
     
    %% declaration du timer pour mettre à jour le graph tension
    gui.timer_xy = timer(...
        'BusyMode','queue',...
        'ExecutionMode', 'fixedRate', ...
        'Period', period_timer_xy, ...
        'TimerFcn', @calc_xy);
     
     
    %% FIN DE LA FONCTION PRINCIPALE
     
     
    % DEBUT DE LA SOUS-FONCTION Bouton_Start %
        function bouton_start1(obj,event)
            set(gui.start1,'BackgroundColor','r');
            set(gui.stop,'BackgroundColor','g');
            if get(gui.inv_perio,'Value')
                set(gui.timer_graph1,'Period',period_timer_xy);
                set(gui.timer_xy,'Period',period_timer_graph1);
            else
                set(gui.timer_xy,'Period',period_timer_xy);
                set(gui.timer_graph1,'Period',period_timer_graph1);
            end
            if get(gui.sens_timer,'Value')
                start(gui.timer_xy);
                start(gui.timer_graph1);
            else
                start(gui.timer_graph1);
                start(gui.timer_xy);
            end
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Bouton_Start %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
     
    % DEBUT DE LA SOUS-FONCTION Bouton_Stop %
        function bouton_stop(obj,event)
            set(gui.stop,'BackgroundColor','r');
            set(gui.start1,'BackgroundColor','g');
            stop(gui.timer_graph1);
            stop(gui.timer_xy);
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Bouton_Stop %
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
     
    % DEBUT DE LA SOUS-FONCTION Affichage_XY %
        function update_display1(obj,event)
            disp('0000000000000000')
            plot(gui.h1,x2,y2,'*');
            drawnow;
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Affichage XY%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    % DEBUT DE LA SOUS-FONCTION Affichage_XY %
        function calc_xy(obj,event)
            disp('-----------------')
            x2=[x2 rand];
            y2=[y2 rand];
        end
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %FIN DE LA SOUS-FONCTION Affichage XY%
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     
    end
    Christophe

    PS : pour l'arrêt des timers, l'ordre n'a pas l'air de changer quoi que ce soit lorsque l'on est dans le code optimal

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

Discussions similaires

  1. [Toutes versions] Problème utilisation de plusieurs Timer simultanément
    Par jems87 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/12/2012, 10h14
  2. utilisation de plusieurs timer.
    Par kanzarih dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/04/2010, 13h10
  3. Application utilisable avec plusieurs SGBD - ADO ou DBX ?
    Par RamDevTeam dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 08h25
  4. [STRUTS] utilisation de plusieurs tags <html:subm
    Par Super Castor dans le forum Struts 1
    Réponses: 6
    Dernier message: 23/06/2004, 11h42
  5. [struts] utilisation de plusieurs fichiers de config
    Par Boosters dans le forum Struts 1
    Réponses: 4
    Dernier message: 25/03/2004, 10h04

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