begin process at 2008 07 06 00:46:35
1 205 425 membres
7 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Ma fenêtre veut pas s'ouvrir... (MFC) [ Divers / Général ] (Taurnil)

Ma fenêtre veut pas s'ouvrir... (MFC) le 24/04/2008 15:29:06

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).

Re : Ma fenêtre veut pas s'ouvrir... (MFC) le 25/04/2008 07:11:09

louis14
pourquoi n'utilises tu pas les timers?

louis14

Re : Ma fenêtre veut pas s'ouvrir... (MFC) le 25/04/2008 09:23:02

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.

Re : Ma fenêtre veut pas s'ouvrir... (MFC) le 25/04/2008 11:18:54

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.

Re : Ma fenêtre veut pas s'ouvrir... (MFC) le 05/05/2008 09:38:14

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.


Re : Ma fenêtre veut pas s'ouvrir... (MFC) le 05/05/2008 15:10:44

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.

Re : Ma fenêtre veut pas s'ouvrir... (MFC) le 16/05/2008 11:29:20

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 ^^

Re : Ma fenêtre veut pas s'ouvrir... (MFC) le 16/05/2008 13:55:08

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.

Re : Ma fenêtre veut pas s'ouvrir... (MFC) le 16/05/2008 15:58:27

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...

Re : Ma fenêtre veut pas s'ouvrir... (MFC) le 16/05/2008 16:06:51

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_)

















[Page 1 Page 2 Page 3]
Classé sous : true, minute, fenêtre, heure, purge

Participer à cet échange

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS