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

C++ Discussion :

Canvas does not allow drawing - Borland c++ 6


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Par défaut Canvas does not allow drawing - Borland c++ 6
    Bonjour,
    je develope mon logiciel sous Borland C++ 6. J'ai souhaité ajouter depuis peu dans mon logiciel un TLabel permettant d'afficher si mon moteur est en mouvement ou pas.

    Voici un peu comment j'ai codé tout ça :

    Lorsque je souhaite bouger mon moteur je fait appel à 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
    void  PM_Engine::SetPositionAxeZWaitStop(double p_position)
    {
            if (!ControlEngine->Cb_testAuto->Checked ==true)
            {
                    #if (MODELE_FOCALE == 122)
                    ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetVitesse(GetVitesseFocal().ToDouble());
                    ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetMouvementAbsoluWaitStop(p_position);
                    #else if (MODELE_FOCALE == 111)
                     double positionActuelle = ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->GetPosition();
                     if ( fabs(positionActuelle-p_position)<FOCALE_M111_ERREUR)
                            return;
     
                     static_cast <TControlEngine*>(GetModuleForm(NULL))->SetMouvementAbsolu_M111(true,p_position,true); // <<<<<<< FONCTION QUI ME POSE PROBLEME
                     double vitesse = GetVitesseFocal().ToDouble();
     
                     ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetVitesse(vitesse);
                     ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetMouvementAbsoluWaitStop(p_position+FOCALE_M111_OFFSET);
                     ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetVitesse(FOCALE_M111_VITESSE_OFFSET);
                     ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetMouvementAbsoluWaitStop(p_position);
                     ListeDeModule.GetModule(MF_M)->GetAxe(MF_A)->SetVitesse(vitesse);
     
     
                    static_cast <TControlEngine*>(GetModuleForm(NULL))->SetMouvementAbsolu_M111(false);
                    #endif
            }
    }
    Et c'est 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
    void TControlEngine::SetMouvementAbsolu_M111(bool etat, double cible,bool litho)
    {
     
            #if (MODELE_FOCALE == 111)
            try
            {
                    Label_focalM111->Visible = true;
                    if ( etat == true)
                    {
     
                            Label_focalM111->Caption = GetTraduction ("Mise en position ... Patientez...");
                            Label_focalM111->Font->Color = clRed;
     
                            repositionnement = true;
                            compteur =0;
                    }
                    else
                    {
                            Label_focalM111->Caption = GetTraduction ("Prêt");
                            Label_focalM111->Font->Color = clGreen;
                    }
                    positionZCible = cible;
                    if ( (litho == false) || (etat== false))
                            Timer_focalM111->Enabled = etat;
            }
            catch(...)
            {
                    int a= 0;
            }
            #endif
     
    }
    sur les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label_focalM111->Caption = GetTraduction ("Mise en position ... Patientez...");
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label_focalM111->Caption = GetTraduction ("Prêt");
    que j'obtiens de manière totalement aléatoire le message suivant "Canvas does not allow drawing". J'ai du mal a comprendre ce que je peux faire de plus. Je ne suis pas dans un thread secondaire pour l'appel de cette fonction je ne peut donc pas utilisé de Synchronize comme j'ai pu voir lors de mes recherche. Es ce que mettre un mutex serai judicieux? mais pourquoi ai-je ce problème ici alors que j'utilise exactement la meme façon de faire ailleurs sans que cela me fasse ce genre de problème.

    Pourriez vous m'aider s'il vous plais.
    Merci d'avance.

  2. #2
    Membre confirmé Avatar de Andarus
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2008
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2008
    Messages : 137
    Par défaut
    Quand tu dis "Je ne suis pas dans un thread secondaire pour l'appel de cette fonction" tu entend par la que tu est dans le thread principal de ton GUI?

    Si ce n'est pas le cas à moins que Canvas(que ne connais pas du tout) soit thread-save. Il est normal que tu est des erreurs aléatoire et mettre un lock de ton coté ni changera rien.

    La règle pour les GUI c'est de n'appeler les fonctions du GUI que depuis le main thread du GUI.

    Après je n'est pas beaucoup d'expérience je peux me planté complètement

  3. #3
    Membre éclairé
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2011
    Messages : 266
    Par défaut
    Quand tu dis "Je ne suis pas dans un thread secondaire pour l'appel de cette fonction" tu entends par la que tu est dans le thread principal de ton GUI?
    Oui j'appel cette fonction depuis le thread Principal de mon GUI.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/02/2014, 17h30
  2. Xbap error : That assembly does not allow partially trusted callers
    Par amandinerenard dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 02/07/2008, 22h31
  3. Réponses: 1
    Dernier message: 26/11/2007, 18h23
  4. Pb de connexion SQL SERVER 2005 Express "does not allow remote connections"
    Par nicolas_cs2i dans le forum Accès aux données
    Réponses: 3
    Dernier message: 19/06/2007, 10h58
  5. [W3C] Pb document type does not allow element "BODY" here W3C validator
    Par megapacman dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 22/06/2006, 13h42

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