begin process at 2012 02 10 11:37:54
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Ma fenêtre veut pas s'ouvrir... (MFC)


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Ma fenêtre veut pas s'ouvrir... (MFC)

jeudi 24 avril 2008 à 15:29:06 | Ma fenêtre veut pas s'ouvrir... (MFC)

Taurnil

Bonjour à tous, je suis actuellement sur un projet qui vise à piloter le port série à l'aide d'une petite interface utilisateur.
Cette interface est réalisée à l'aide de la MFC de Visual C++ (je travaille avec la version 6.0).

J'en arrive à mon problème :

Dans mon programme (qui est en fait un temporisateur), je dois vérifier l'heure de l'horloge et si celle-ci est égale à l'heure rentrée par l'utilisateur dans la fenêtre, on envoie un "1" sur une des broches de mon port COM.
Je teste donc l'heure en continu avec ce bout de programme :

code :


while (true) {
        curTime = CTime::GetCurrentTime();
        heure = curTime.GetHour(); //séparation heures-minutes
        minute = curTime.GetMinute();
        
        if (heure == m_heurefermeture && minute == m_minutefermeture) {            
          // Mise à 0 DTR
  EscapeCommFunction(g_hCOM, CLRDTR);
 PurgeComm(g_hCOM, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
        UpdateData(TRUE);

        } else if (heure == m_heureouverture && minute == m_minuteouverture) {
         //Mise à 1 DTR    
     PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
    EscapeCommFunction(g_hCOM, SETDTR);       
        }
        m_heure = heure;        //affichage pour test            
        m_minute = minute;
        UpdateData(FALSE);
        Sleep(30000);}
    return TRUE;  // return TRUE  unless you set the focus to a control
}

Vous l'avez donc compris, la boucle se répète en continu toutes les 30 secondes.

Mais le problème est là : J'ai l'impression que mon programme essaie de finir la boucle avant d'ouvrir ma fenêtre alors que celle-ci ne se termine jamais.

Je sais pas comment faire, j'ai entendu parler de threads mais c'est encore un peu compliqué pour moi.

Si quelqu'un trouve quelquechose d'autre, qu'il n'hésite pas. Sinon, un lien vers un tuto sur les threads serait le bienvenu (en français si c'est possible).

A tous merci d'avance, si quelqu'un arrive à me sortir de là, je lui en serais (vraiment très reconnaissant).
vendredi 25 avril 2008 à 07:11:09 | Re : Ma fenêtre veut pas s'ouvrir... (MFC)

louis14

pourquoi n'utilises tu pas les timers?

louis14
vendredi 25 avril 2008 à 09:23:02 | Re : Ma fenêtre veut pas s'ouvrir... (MFC)

Taurnil

Salut Louis, à vrai dire si je n'utilise pas les timers, c'est parce que je ne connaissais pas. Quand tu parles de timers, tu parles de fonction du type SetTimer(blabla, durée, NULL);  et KillTimer(blabla); ?

Si c'est de ça que tu parles, on ne peut utiliser ces fonctions (si j'ai bien compris), que pour travailler avec des intervalles de temps : et dans mon programme, l'utilisateur peut changer d'heure chaque jour, donc l'intervalle peut changer. De plus, l'utilisateur rentre une heure et pas un intervalle de temps.

Si c'était pas de ça dont tu parlais ou si tu n'es pas d'accord avec ce que j'ai dit, je suis évidemment ouvert à toutes critiques/suggestions.

Merci à tous d'avance.
vendredi 25 avril 2008 à 11:18:54 | Re : Ma fenêtre veut pas s'ouvrir... (MFC)

Taurnil

Bon, je viens de tester quelque petites choses : la fenêtre ne s'ouvre toujours pas (ça serait trop beau) mais TOUT le reste du programme a l'air de fonctionner, si tant est qu'on rentre les heures d'ouverture et de fermeture directement dans le code.

En effet, si j'initialise (par exemple) heure d'ouverture à 10h10 et heure de fermeture à 10h11, et bien mon électrovanne s'ouvre bien à 10h10 pour se fermer à 10h11.

Il me manque plus que ma fenêtre pour pouvoir entrer les heures sans passer par la source......

De grâce..... J'y suis presque.

Merci d'avance.
lundi 5 mai 2008 à 09:38:14 | Re : Ma fenêtre veut pas s'ouvrir... (MFC)

Taurnil

J'avance plus, j'ai entendu parler de pompes à messages et de thread de travail à utiliser, si quelqu'un pouvait me mettre sur la voie de ce côté là ou même me trouver quelque chose d'autre, merci à lui de se manifester .

Voila, en attendant vos réponses qui, je l'espère seront nombreuses, veuillez agréer madame, mons...., une bonne journée à tous.

lundi 5 mai 2008 à 15:10:44 | Re : Ma fenêtre veut pas s'ouvrir... (MFC)

Taurnil

Bon, bah ça marche, ma fenêtre s'ouvre et en même temps la boucle tourne.

J'ai toujours un probleme cependant, quand j'appelle UpdateData(FALSE ou TRUE) dans le thread j'ai ça qui sort :

error C2065: 'UpdateData' : undeclared identifier

Alors que quand j'appelle dans le main, pas d'erreur.
Quelqu'un sait il pourquoi ?


Bon, si quelqu'un veut avoir plus de détail sur comment j'ai fais, envoyez moi un mp plutôt que de poster ici. Encore que comme ça ça fera un peu moins monologue.

Allez ++ et bonne journée a tous.
vendredi 16 mai 2008 à 11:29:20 | Re : Ma fenêtre veut pas s'ouvrir... (MFC)

Taurnil

J'ai trouvé pourquoi j'avais le problème de UpdateData : undeclared identifier.

En fait cette fonction est une fonction de CWnd, la fonction qui l'appelle doit donc être membre de CWnd ou d'une classe dérivant de CWnd.

Bon, j'ai toujours un problème, je pense que j'aurais toujours pas de réponses mais bon (c'est mon 6ème post d'affilée) , je vous montre quand même les qques parties du programme qui posent problème :

voilà ma déclaration de la fonction dans la classe CFenetre1Dlg:


class CFenetre1Dlg : public CDialog
{
// Construction
public:
CFenetre1Dlg(CWnd* pParent = NULL); // standard constructor
 
void *__cdecl boucle(void*);
[...]
};
 


Ma fonction dans le main :

void* CFenetre1Dlg:: boucle(void*)
{
[...]//ma fonction boucle
};


Et enfin la déclaration de ma fonction dans le thread :


pthread_create(&thread, NULL, __cdecl CFenetre1Dlg:: boucle, NULL);


Alors, avec ça, j'ai l'erreur suivante :
error C2059: syntax error : '__cdecl'

Donc, voilà, si quelqu'un sait comment régler le problème... Merci à lui de se manifester, bonne journée à tous ^^
vendredi 16 mai 2008 à 13:55:08 | Re : Ma fenêtre veut pas s'ouvrir... (MFC)

Taurnil

J'ai relu un truc qui m'a fait corriger l'erreur précédente, en fait pthread_create exige une fonction libre ou une fonction membre statique. Donc j'ai redeclaré comme suit :
Code : C


staticvoid*__cdeclboucle(void*);


L'erreur n'est plus là mais une nouvelle est apparue ...

La voici :


error C2352: 'CWnd::UpdateData' : illegal call of non-static member function
see declaration of 'UpdateData'


Voilà... Merci mille fois si vous pouvez m'aider.
vendredi 16 mai 2008 à 15:58:27 | Re : Ma fenêtre veut pas s'ouvrir... (MFC)

juju12

je suppose que ta fonction UpdateData tu l'appelles depuis boucle()?
dans ce cas ça ne peut pas marcher puisque UpdateData() est fonction membre donc il faut une instance de classe (convention __thiscall), alors que boucle() est static donc ne concerne pas d'instance.
Pour régler ce problème, ce que tu peux faire par exemple est passer un pointeur sur une instance de classe comme paramètre à ton thread et l'utiliser ainsi.

Si c'était pas ça du tout mets un peu plus de code...
vendredi 16 mai 2008 à 16:06:51 | Re : Ma fenêtre veut pas s'ouvrir... (MFC)

Taurnil

En effet, j'appelle UpdateData depuis boucle, bah j'ai pas trop compris ce qu'il fallait que je change alors je te met le code de la fonction boucle et de l'appel par le thread ainsi que mon .h, c'est parti :

Fonction boucle:

void* CFenetre1Dlg:: boucle(void*Fenetre1Dlg)
{
    while (true) {
int    heure,m_heurefermeture,minute,m_minutefermeture,m_heureouverture,m_minuteouverture,m_heure,m_minute;

AfxMessageBox("mise a jour 30 secondes",NULL);
            CTime curTime = CTime::GetCurrentTime();
        heure = curTime.GetHour(); //séparation heures-minutes
        minute = curTime.GetMinute();
       
        if (heure == m_heurefermeture && minute == m_minutefermeture) {           
       EscapeCommFunction(g_hCOM, CLRDTR);
 PurgeComm(g_hCOM, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
  AfxMessageBox("fermeture électrovanne", MB_ICONSTOP);      

 
        } else if (heure == m_heureouverture && minute == m_minuteouverture) {
            PurgeComm(g_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
    EscapeCommFunction(g_hCOM, SETDTR);
     AfxMessageBox("ouverture électrovanne", MB_ICONSTOP);      

        }


m_heure = heure;        //affichage pour test           
        m_minute = minute;

Sleep(30000);
    }
UpdateData(TRUE);

return 0;
}


Ensuite, l'appel de la fonction par le thread :

pthread_t thread;

pthread_create(&thread, NULL, CFenetre1Dlg:: boucle, NULL);


Et pour finir le code du .h

#if !defined(AFX_FENETRE1DLG_H__72AE1160_5639_400E_8E40_87DB8B00238F__INCLUDED_)
#define AFX_FENETRE1DLG_H__72AE1160_5639_400E_8E40_87DB8B00238F__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// CFenetre1Dlg dialog


           

class CFenetre1Dlg : public CDialog
{
// Construction
public:
    CFenetre1Dlg(CWnd* pParent = NULL);    // standard constructor

static void *__cdecl boucle(void*);

// Dialog Data
    //{{AFX_DATA(CFenetre1Dlg)
    enum { IDD = IDD_FENETRE1_DIALOG };
    BOOL    m_activer;
    int        m_heurefermeture;
    int        m_minutefermeture;
    int        m_heureouverture;
    int        m_minuteouverture;
    int        m_heure;
    int        m_minute;
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CFenetre1Dlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
   
protected:
    HICON m_hIcon;

    // Generated message map functions
    //{{AFX_MSG(CFenetre1Dlg)
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    virtual void OnCancel();
    afx_msg void Onapropos();
    afx_msg void OnCheck1();
    afx_msg void OnButton2();
    afx_msg void OnButton3();
    afx_msg void Onhautheurefermeture();
    afx_msg void Onbahheurefermeture();
    afx_msg void Onhautminutefermeture();
    afx_msg void Onhautminuteouverture();
    afx_msg void Onbasminuteouverture();
    afx_msg void Onhautheureouverture();
    afx_msg void Onbasheureouverture();
    afx_msg void Onbasfermeturemin();
    afx_msg void OnOuvrirelectrovanne();
    afx_msg void OnFermerelectrovanne();
    afx_msg void Onheureouvertureh();
    afx_msg void Onheureouverturemin();
    afx_msg void Onheurefermetureh();
    afx_msg void Onheurefermeturemin();
    afx_msg void OnChangeEdit5();
    afx_msg void OnChangeEdit6();
    afx_msg void OnButton9();
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};



//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_FENETRE1DLG_H__72AE1160_5639_400E_8E40_87DB8B00238F__INCLUDED_)
















1 2 3

Cette discussion est classée dans : true, minute, fenêtre, heure, purge


Répondre à ce message

Sujets en rapport avec ce message

aide c++ [ par jekburn ] #include #include typedef struct{   int heure;   int minute;   int seconde;}TEMPS; TEMPS diff(TEMPS t1,TEMPS t2){   TEMPS t3; &n conversion heure et minute en seconde [ par nazca ] Le Zero de la programmationNazcacomment fait on pour convertir des heures et minutes en secondes car j'aimerais faire la difference entre 2 heures.mer modifier login msn messenger en fonction de l heure [ par morgandetoi06 ] bonjour, j aimerai savoir s'il est possible de faire un programme qui change automatiquement le login sur MSN messenger en fonction de l'heure du syst Aide en java [ par Alex28 ] En java, je créé une fenêtre de type JFrame avec des boutons et lors de l'appui de l'un de ces boutons, je veux qu'une autre fenêtre s'ouvre mais qu'e [BCB]Empêcher l'execution multiple d'une fenêtre [ par thebeith ] Salut,Je voudrais que l'appli que je développe ne puisse se lancer qu'une seule fois.Mais je n'arrive pas à empecher l'execution multiple de cette app fenêtre sans barre de taches [ par garslouche ] Bonjourje voudrais savoir comment faire pour qu'une fenêtre modale n'apparaisse pas dans la barre de taches.Merci heure [ par Tautau ] Bonjour a tous,Je souhaite iconifier mon appli avec un systemtray ca je sais faire mais le probleme c'est que je veux comme icone un comptarebour qui cacher une fenêtre Dos [ par lysane ] j'ai créer un serveur qui tourne sur une machine, mon appli se lance à l'ouverture d'une session seulement, visual studio ouvre par défaut une fenêtr cacher une fenêtre [ par lysane ] J'ai utilisée la fonction showwindow pour cacher ma fenêtre:ShowWindow(FindWindow("ConsoleWindowClass",NULL),SW_HIDE); sous win2000 pas de problème, s lecture d'une video dans une fenêtre Animate [ par mistigwn ] Bonjour!Je cherche la/les fonction(s) permettant d'ajuster la taille de mes videos dans une fenêtre de type Animation, cette dernière étant intégrée a


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,279 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales