Faire une pause dans l'éxécution d'une boucle en C++ ? - Programmation
Marsh Posté le 09-04-2001 à 11:12:55
la methode basique, et surtout assez bourrine consiste a effectuer une boucle de 0 a 'tres beaucoup', ou plusieurs boucles imbriquees....
a nutiliser quand cas dextreme urgence.
Marsh Posté le 09-04-2001 à 11:42:05
et wait ??? (include <sys/wait.h> )
Marsh Posté le 09-04-2001 à 11:42:40
pardon avait pas lu Borland Builder...
Marsh Posté le 09-04-2001 à 11:46:46
Bien, la methode bas niveau pour cela est la scrutation.
j'explique.
tu fais un boucle
while(1)
{
...
id = 0;
while(id = 0);
....
}
id passe à 1 par le biais d'une fonction annexe .. (interruption la plupart du tps)...
maintenant, sachant pas ce que tu veux faire ... je sais pas si cette reponse te conviendra !
@+
Marsh Posté le 09-04-2001 à 12:07:52
j'explique en gors ce que je veux faire :
J'ai une boucle inféfinie que l'on lance avec une checkbox et que l'on doir arreter de la meme facon.
Le probleme vient du fait que je peux pas décocher la checkbox une fois la boucle lancée, je pense donc en faisant une pause, j'aurais le temps de la décocher.
Marsh Posté le 09-04-2001 à 13:13:58
Je suis pas certain que Sleep fonctionnera pour ce que tu veux faire. Sleep "gèle" le Thread en cours ... donc tu ne sauras pas décocher pendant le Sleep sauf si tu fais un programme multi-threads.
Ci-dessous j'ai testé ce que tu veux faire. Cela fonctionne chez moi mais j'utilise Visual C++ et les MFC pas Borland.
A toi d'adapter :
void CTestDlg::OnCheck1()
{
// Appelé lorsque la case est cochée
UpdateData(TRUE); // Récupère les infos du contrôle
if (m_bCheck) StartBoucle(); // Teste si coché
}
void CTestDlg::StartBoucle()
{
// Boucle infinie (sauf si on décoche la case)
SetTimer(1, 100, NULL); // Timer pour vérification
m_bFlag = TRUE; // Flag de contrôle de la boucle
do
{
// Boucle infinie
DoEvents();
}
while (m_bFlag);
}
void CTestDlg::OnTimer(UINT nIDEvent)
{
// handler Timer
KillTimer(1); // Kill Timer
UpdateData(TRUE); // Récupère les infos du contrôle
if (!m_bCheck) m_bFlag = FALSE; // On stoppe la boucle
else SetTimer(1, 100, NULL); // sinon init Timer de nouveau
CDialog::OnTimer(nIDEvent);
}
void CTestDlg::DoEvents()
{
// Laisse le système d'exploitation traiter les messages en attente
MSG Msg;
BOOL bRet;
if (PeekMessage(&Msg, m_hWnd, 0, 0, PM_NOREMOVE))
{
if ((bRet = GetMessage(&Msg, m_hWnd, 0, 0)))
DispatchMessage(&Msg);
}
}
PS
m_bCheck est la variable (booléenne) qui se rapporte au contrôle "case à cocher".
Voilà j'espère que ca aide.
Flying
Marsh Posté le 09-04-2001 à 13:16:35
C'est très très chiant ces smileys dès qu'on écrit du code.
Il serait temps que le forum adopte un système pour mettre le code à part et qu'il apparaisse + lisiblement.
Voir par exemple le cas du forum CodeGuru !!!
On place le code entre [ccode] et [/ccode] et c'est nickel
Flying
Marsh Posté le 09-04-2001 à 16:24:43
Merci de l'aide.
J'ai éssayé avec _sleep(x) =>Fait une pause sans plus.
La méthode de Flying est assez costaud pour mon niveau.
Marsh Posté le 09-04-2001 à 16:28:32
Flying a écrit a écrit : C'est très très chiant ces smileys dès qu'on écrit du code. Il serait temps que le forum adopte un système pour mettre le code à part et qu'il apparaisse + lisiblement. Voir par exemple le cas du forum CodeGuru !!! On place le code entre [ccode] et [/ccode] et c'est nickel Flying |
Je suis tout a fiat d'accord avec toi, je pense que la mise en place d'un topic la dessus serait une bonne idée
Marsh Posté le 09-04-2001 à 10:42:49
Il existe la commande delay(x) mais le compilateur en veux pas ! (C++ builder 5), une idée ?