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

MATLAB Discussion :

Arrêter l'exécution d'un script à partir d'une fonction


Sujet :

MATLAB

  1. #1
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut Arrêter l'exécution d'un script à partir d'une fonction
    Bonjour,

    Je veux savoir s'il est possible de arrêter l'exécution d'un script à partir d'un fonction
    Exemple
    Fonction main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    clear all
    clc
    disp('Line 3')
    Mafonction(..)
    disp('Line 8')
    disp('Line 9')
    Mafonction()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    .
    ...
    commande pour arrêter l'exécution du programme main
    je ne veux pas utiliser la fonction return ou bien error
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    En utilisant les fonctionnalités de calcul parallèle, il est possible de dire à un job/task de s'arreter
    Sinon, à la main cela semble plus difficile. Je vois plusieurs approches:
    - modifier le script pour qu'il vérifie fréquemment s'il a été arrêté (par exemple, existence d'un fichier crée par la fonction pour lui signifier d'arrêter)
    - Envoyer Ctrl+C au script (çà va commencer à dépendre de la plateforme). Mais il y aura une erreur en sortie du script "execution stopped by user"

  3. #3
    Membre éprouvé
    Avatar de soft001
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2008
    Messages
    409
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 409
    Points : 1 146
    Points
    1 146
    Par défaut
    Citation Envoyé par VV33D Voir le message
    Bonjour,

    En utilisant les fonctionnalités de calcul parallèle, il est possible de dire à un job/task de s'arreter
    J'ai essayé de faire quelque chose avec ça mais j'ai rien compris, est ce que tu peux me donner un exemple avec ce que je tente de faire.

    Citation Envoyé par VV33D Voir le message
    Sinon, à la main cela semble plus difficile. Je vois plusieurs approches:
    - modifier le script pour qu'il vérifie fréquemment s'il a été arrêté (par exemple, existence d'un fichier crée par la fonction pour lui signifier d'arrêter)
    Si tu reviens à mon premier message j'ai dis que je veux pas utiliser ni return ni.. parce que je veux pas ajouté des ligne supplémentaire à mon programme main

    Citation Envoyé par VV33D Voir le message
    - Envoyer Ctrl+C au script (çà va commencer à dépendre de la plateforme). Mais il y aura une erreur en sortie du script "execution stopped by user"
    J'ai déjà regardé cette solution avant de postuler ici, et comme tu viens de dire elle n'est pas élégante vu le message d'erreur qui sort.
    Voici la fonction qui joue le même rôle que CTRL+C, (je l'ai trouvé sur internet) mais juste elle maintient la touche CTRL appuyée (un simple clique résout le problème)
    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
    function terminateExecution
    %terminateExecution  Emulates CTRL-C
    %    terminateExecution   Stops operation of a program by emulating a
    %    CTRL-C press by the user.
    %
    %    Running this function
    %
    %Example:
    %for ix = 1:100
    %    disp(ix)
    %    if ix>20
    %        terminateExecution;
    %    end
    %end
     
    %1) request focus be transferred to the command window
    %   (H/T http://undocumentedmatlab.com/blog/changing-matlab-command-window-colors/)
    cmdWindow = com.mathworks.mde.cmdwin.CmdWin.getInstance();
    cmdWindow.grabFocus();
     
    %2) Wait for focus transfer to complete (up to 2 seconds)
    focustransferTimer = tic;
    while ~cmdWindow.isFocusOwner
        pause(0.1);  %Pause some small interval
        if (toc(focustransferTimer) > 2)
            error('Error transferring focus for CTRL+C press.')
        end
    end
     
    %3) Use Java robot to execute a CTRL+C in the (now focused) command window.
     
    %3.1)  Setup a timer to relase CTRL + C in 1 second
    %  Try to reuse an existing timer if possible (this would be a holdover
    %  from a previous execution)
    t_all = timerfindall;
    releaseTimer = [];
    ix_timer = 1;
    while isempty(releaseTimer) && (ix_timer<= length(t_all))
        if isequal(t_all(ix_timer).TimerFcn, @releaseCtrl_C)
            releaseTimer = t_all(ix_timer);
        end
        ix_timer = ix_timer+1;
    end
    if isempty(releaseTimer)
        releaseTimer = timer;
        releaseTimer.TimerFcn = @releaseCtrl_C;
    end
    releaseTimer.StartDelay = 1;
    start(releaseTimer);
     
    %3.2)  Press press CTRL+C
    pressCtrl_C
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    function pressCtrl_C
        import java.awt.Robot;
        import java.awt.event.*;
        SimKey=Robot;
        SimKey.keyPress(KeyEvent.VK_CONTROL);
        SimKey.keyPress(KeyEvent.VK_C);
     
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    function releaseCtrl_C(ignore1, ignore2)
        import java.awt.Robot;
        import java.awt.event.*;
        SimKey=Robot;
        SimKey.keyRelease(KeyEvent.VK_CONTROL);
        SimKey.keyRelease(KeyEvent.VK_C);
    Si tu trouves ma réponse utile, n'oublies pas de voter pour ce me message

  4. #4
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par VV33D Voir le message
    Bonjour,


    - modifier le script pour qu'il vérifie fréquemment s'il a été arrêté (par exemple, existence d'un fichier crée par la fonction pour lui signifier d'arrêter)
    C'est ce que je fais quand j'ai besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if exist('stop.txt', 'file')
        return 
    end
    et une variante pour enchaîner les scripts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ~exist('start.txt', 'file')
       pause(10)
    end
    %% ici la suite du programme
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

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

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    Bonjour,
    est-ce une méthode conventionnelle d'utiliser des fichiers pour ce type de manipulation ?
    J'aurais plutôt tendance à utiliser getappdata :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % initialisation
    setappdata(0,'STOP', false);
     
    % dans le code qui va stopper
    setappdata(0,'STOP', true);
     
    % et dans le code à stopper
    if getappdata(0, 'STOP')
        return 
    end

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Bonjour,

    Je n'ai pas d'exemple sous la main, mais en gros tu définis un job auquel tu assignes des tache (avec createtask()). On accède aux tasks crées via findTask().

    est-ce une méthode conventionnelle d'utiliser des fichiers pour ce type de manipulation ?
    C'est une approche classique, mais sujette aux race conditions. Je ne sais pas comment les race conditions sont gérées par setappdata.

    En python par exemple, plutôt que d'utiliser un fichier, il faut utiliser un serveur (essayer de créer un serveur sur un port donné. si on n'y arrive pas c'est qu'une autre fonction l'a déjà crée)

  7. #7
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Très intéressant ce fil. Si je peux me permettre de l'incruster, j'aurais quelques questions après les précédentes réponses :

    @VV3D : race condition ? En quoi un thread qui crée un fichier et un autre qui le consulte peut proviquer un étar de "race condition" ?

    @tubaas : je lis dans la doc de setappdata que :
    Application data is data that is meaningful to or defined by your application which you attach to a figure or any GUI component (other than ActiveX controls) through its AppData property. Only Handle Graphics MATLAB objects use this property.
    => est-ce que tu peux préciser comment tu gères ça ?
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

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

    Informations professionnelles :
    Activité : Acousticien
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2009
    Messages : 641
    Points : 825
    Points
    825
    Par défaut
    salut
    en fait en utilisant setappdata avec 0 comme handle, cela utilise ta "session" MATLAB (je ne sais pas exactement en fait donc je ne serai pas plus précis, DUT est le spécialiste). Tes variables seront stockées tant que tu ne fermeras pas MATLAB (ou que tu ne les supprimeras pas avec rmappdata). C'est une méthode permettant d'éviter les variables globales et t'obligeant à accéder explicitement à ta variable pour pouvoir la modifier.
    Par rapport à la création d'un fichier, cela permet d'avoir seulement des accès mémoire plutôt que disque mais je ne sais pas si c'est mieux pour autant. Il faudra bien entendu toujours être très prudent sur la synchronisation et la façon dont MATLAB enchaîne les tâches.

  9. #9
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Merci pour les explications. J'ai compris
    en effet, tu fais la même chose en mémoire que ce que d'autres proposaient sur le disque.
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

  10. #10
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    @ol9245:
    En quoi un thread qui crée un fichier et un autre qui le consulte peut proviquer un état de "race condition"
    J'avoue ne plus être sur de moi sur ce point:
    * Dans le cas le plus simple, il semble qu'il n'y ait pas de problème de 'race'(ie si je vérifie pendant qu'il est en train d'être crée, je ne le vois pas et le redétecterai plus tard).
    * Par contre si les 2 threads ont le droit de créer le fichier, ou si on se mets à dépendre du contenu du fichier, la y'a de gros problèmes de synchro.
    * J'imagine de plus que ce qui se passera dépends de l'os, de si le fichier est sur disque virtuel etc...

  11. #11
    Membre éprouvé
    Avatar de ol9245
    Homme Profil pro
    Chercheur
    Inscrit en
    Avril 2007
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Avril 2007
    Messages : 985
    Points : 1 158
    Points
    1 158
    Billets dans le blog
    1
    Par défaut
    Oui bien sur, il faut un fichier distinct pour chaque thread qui a le droit d'en écrire un. En ce sens ça fonctionne pas exactement comme une porte de synchronisation ou plusieurs threads peuvent demander de fermer la porte en même temps (et encore que là, ce sont des objets spéciaux, qui savent compter le nombre de demande de fermeture).

    Je crois que là on sort complètement du sujet du forum car je ne crois pas que ce type d'objet de synchronisation existe dans Matlab.

    Si oui, je suis preneur.
    "La vraie grandeur se mesure par la liberté que vous donnez aux autres, et non par votre capacité à les contraindre de faire ce que vous voulez." Larry Wall, concepteur de Perl.

Discussions similaires

  1. Comment arrêter l'exécution d'un script ?
    Par [ZiP] dans le forum Général Python
    Réponses: 10
    Dernier message: 08/11/2011, 20h00
  2. Réponses: 7
    Dernier message: 12/06/2009, 16h13
  3. Exécuter un Script ksh a partir d'une fonction ADA
    Par chaminette dans le forum Ada
    Réponses: 5
    Dernier message: 10/03/2009, 19h47
  4. arrêter l'exécution d'un script
    Par remessa dans le forum Général Python
    Réponses: 4
    Dernier message: 03/02/2009, 14h16
  5. Exécution d'un script à partir de code java
    Par ridecat dans le forum Langage
    Réponses: 4
    Dernier message: 02/11/2008, 19h09

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