Faire un timeout sur une question/réponse

gilleshugues Messages postés 4 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 30 juin 2009 - 17 janv. 2008 à 18:36
cs_charbit Messages postés 1 Date d'inscription dimanche 20 juillet 2008 Statut Membre Dernière intervention 20 juillet 2008 - 20 juil. 2008 à 15:42
Voila mon problème .

J'ai 2 applis qui échangent des données via un socket . L'appli qui questionne est en C++ (MFC) et celle qui
répond en VB . Jusqu'ici rien de méchant .

Mon appli C++ pose une question :

MainSocket.Send("QUESTION");

Puis attend la réponse de l'appli VB , mais avec un timeout de 2s , donc on doit sortir
de la boucle si on a des données dans le MainSocket , ou bien au bout des 2s (variable bTimeOut) .

Ca marche assez bien , mais si l'appli VB ne répond pas , et malgré le "PeekMessage" qui revient donc
à peu près au même qu'un DoEvents j'ai quand même la CPU qui monte à 50% environ , et mon menu
déroulant est comme "figé" .

J'ai entendu parler de Threads , mais je ne vois pas très bien ce que ça pourrait faire .

CWinApp* pApp = AfxGetApp();
MSG msg;

// Boucle d'attente (maxi 2 secondes)
do
    {
     // Récupère l'heure courante
     ActualTime = CTime::GetCurrentTime();
     // Regarde le nombre de secondes écoulées depuis le lancement (je sais
     // à minuit ça va planter)
     nsec = ActualTime.GetSecond() - BeginTime.GetSecond();
     // Si on a passé 2 secondes alors Timeout pour sortir de la boucle
     if (nsec > 2) bTimeout = true ;
     // DoEvents
     while ( PeekMessage ( &msg, NULL, 0, 0,PM_NOREMOVE )) pApp->PumpMessage();
    }
while (MainSocket.m_strRecv.IsEmpty() && bTimeout == false);

Merci d'avance pour votre aide .

2 réponses

nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
17 janv. 2008 à 22:38
Salut
utilise un thread pour monitorer ta socket , avec un select .
dans le select utilise un timeout de 2secs(ou du nombre de secondes que tu veux) , si le select retourne au bout du timeout que tu n'as pas de reponse, alors agit en consequence.

ca c'est algorithme en gros (corrigez-moi si je rate qqch).
A moins de me tromper , ton application fige justement parce que tu fais une boucle et que tu attends que la socket te reponde , so si ton timeout est 10 secondes (imagine le client au SAHARA et toi en france)
ton appli va geler 10 secondes avant de prendre une decision....!

je suis heureux de faire partie d'une grande famille ...!
0
cs_charbit Messages postés 1 Date d'inscription dimanche 20 juillet 2008 Statut Membre Dernière intervention 20 juillet 2008
20 juil. 2008 à 15:42
Bonjour, je debute en C++ et j'ai besoin qu'un programme execute quelque chose si l'utilisateur n'a pas rentré une donnée dans les 20 secondes.
J'aurais par ailleurs besoin de rentrer des données dans une base de donnée (access) dans ces données figure le temps.....
Je ne sais pas du tout comment m'y prendre. Merci de m'aider.
0
Rejoignez-nous