begin process at 2012 05 30 07:32:57
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Divers

 > 

question sur thread


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

question sur thread

dimanche 6 avril 2008 à 16:43:28 | question sur thread

elbok

j'ai essayé d'écrir ce code(j'utilise Visual C++ mais jécris en C application Win32)

//je veux créer un thread qui fait appele à une procédure(verifier_connexion(cli,&v);)
DWORD __stdcall threadroutine ((void *param)

    BOOL bEnd = FALSE;
    // Tant que bEnd est à FALSE, on continue
    while(!bEnd) {
        //ce tread doit appeler une fonction qui est la suivante
        verifier_connexion(cli,&v);
  printf("\n");
  Sleep(100);
    }

    return 0;
}

mais le problème que si je change l'appele de la procédure  par un simple affiche c'est bon, mais pour l'appele de procédure il existe tjrs un problème

je n'es pas compris ou est le problème.
je veux savoir comment faire un appel d'une procédure verifier_connexion(cli,&v); à travers un thread
aidez moi S.V.P c'est trés trés urgent
merçi d'avance.

dimanche 6 avril 2008 à 17:00:54 | Re : question sur thread

SAKingdom

Membre Club
"mais pour l'appele de procédure il existe tjrs un problème".
Quel est ce problème ?

Déjà:

BOOL bEnd = FALSE;
    // Tant que bEnd est à FALSE, on continue
    while(!bEnd) {

Tu ne sortiras jamais de la boucle ainsi, car bEnd n'est jamais mit à TRUE.

verifier_connexion(cli,&v);

cli et v sont des variables globales j'imagine. Ça signifie donc que rien ne garantis que leur valeurs seront différente lors du prochain appel à verifier_connexion. Ainsi donc, rien ne garantis non plus au thread modifiant ces valeurs qu'elles seront bien traitées.

C++ (@++)

lundi 7 avril 2008 à 09:52:39 | Re : question sur thread

elbok

merci j'ai pu au moins localiser ou est le problème. mais savez vous S.V.P une autre méthode pour appeler cette procédure par exemple toute les 100 ms sans passer par les threads en utilisant les timers. je n'est aucune idée mais j'entend parler et j'ai même effectuer un recherche mais je n'est pas trouvé ce que je cherche.
merçi bien 
lundi 7 avril 2008 à 11:09:39 | Re : question sur thread

jfrancois

Bonjour,

Avec la fonction SetTimer() et soit la gestion du message WM_TIMER, soit l'appel direct d'une fonction.

Jean-François

lundi 7 avril 2008 à 12:39:20 | Re : question sur thread

elbok

pouvez vous m'indiquer comment utiliser cette fonction parce que je suis bien débutant alors si il ya un exemple ca sera le bienvenue
merçi bien
lundi 7 avril 2008 à 13:07:27 | Re : question sur thread

jfrancois

Il y a 2 méthodes d'utilisation des timers de Windows :
- Avec gestion du message WM_TIMER dans la fenêtre propriétaire.
- Avec appel direct d'une fonction.

Voici les 2 méthodes d'utilisation avec 2 timers à chaque fois :

1) Méthode avec gestion du message Windows

#define ID_TIMER_1 1000 // identificateur du timer 1
#define ID_TIMER_2 1001 // identificateur du timer 2


// --- Fonction de gestion des messages de la fenêtre
LRESULT CALLBACK WinProc
(
    HWND   hWnd   // I:handle to the window
   ,UINT   uiMsg  // I:message to process
   ,WPARAM wParam // I:WPARAM parameter
   ,LPARAM lParam // I:LPARAM parameter
)                 // O:return code
{
   switch (uiMsg)
   {
      // ----------------
      // Créer la fenêtre
      // ----------------
      case WM_CREATE :     // si c'est une fenêtre classique
      case WM_INITDIALOG : // si c'est une boîte de dialogue
      {
         ...

         // --- Lancer les timers
         SetTimer(hWnd,ID_TIMER_1,1000,NULL);// toutes les 1s
         SetTimer(hWnd,ID_TIMER_2,2000,NULL);// toutes les 2s
      }
      return 0;


      // ------------------
      // Traiter les timers
      // ------------------
      case WM_TIMER :
      {
         if (wParam == ID_TIMER_1)
         {
            ... Traitement du timer 1 ...
         }
         else if (wParam == ID_TIMER_2)
         {
            ... Traitement du timer 2 ...
         }
      }
      return 0;


      // ---------------------
      // Quitter l'application
      // ---------------------
      case WM_DESTROY :                // si c'est une fenêtre classique
      case "quitter" dans WM_COMMAND : // si c'est une boîte de dialogue
      {
         ...

         // --- Tuer les timers
         KillTimer(hWnd,ID_TIMER_1);
         KillTimer(hWnd,ID_TIMER_2);

         ...
      }
      return 0;
   }

  
   // --- Retour du traitement par défaut
   return DefWindowProc(hWnd,uiMsg,wParam,lParam);
}

 

2) Méthode avec appel direct d'une fonction

// --- Fonction de traitement du premier timer
VOID CALLBACK Fonction1
(
    HWND  hWnd    // I:handle to the window
   ,UINT  uiMsg   // I:WM_TIMER message
   ,UINT  uiEvent // I:timer identifier
   ,DWORD dwTime  // I:current system time
)
{
   ... Traitement du timer 1 ...
}

 

// --- Fonction de traitement du second timer
VOID CALLBACK Fonction2
(
    HWND  hWnd    // I:handle to the window
   ,UINT  uiMsg   // I:WM_TIMER message
   ,UINT  uiEvent // I:timer identifier
   ,DWORD dwTime  // I:current system time
)
{
   ... Traitement du timer 2 ...
}

 

// --- Fonction de gestion des messages de la fenêtre
LRESULT CALLBACK WinProc
(
    HWND   hWnd   // I:handle to the window
   ,UINT   uiMsg  // I:message to process
   ,WPARAM wParam // I:WPARAM parameter
   ,LPARAM lParam // I:LPARAM parameter
)                 // O:return code
{
   static int iIDTimer1; // ID du timer 1
   static int iIDTimer2;
// ID du timer 2

   switch (uiMsg)
   {
      // ----------------
      // Créer la fenêtre
      // ----------------
      case WM_CREATE :     // si c'est une fenêtre classique
      case WM_INITDIALOG : // si c'est une boîte de dialogue
      {
         ...

         // --- Set the timers
         iIDTimer1 = SetTimer(NULL,0,1000,Beep1); // toutes les 1s
         iIDTimer2 = SetTimer(NULL,0,2000,Beep2);
// toutes les 2s
      }
      return 0;


      // ---------------------
      // Quitter l'application
      // ---------------------
      case WM_DESTROY :                // si c'est une fenêtre classique
      case "quitter" dans WM_COMMAND : // si c'est une boîte de dialogue
      {
         ...

         // --- Tuer the timers
         KillTimer(hWnd,iIDTimer1);
         KillTimer(hWnd,iIDTimer2);

         ...
      }
      return 0;
   }


   // --- Retour du traitement par défaut
   return DefWindowProc(hWnd,uiMsg,wParam,lParam);
}

Jean-François

lundi 7 avril 2008 à 13:09:31 | Re : question sur thread

jfrancois

Petit problème de copier/coller !!!
Dans la seconde méthode c'est :

         // --- Lancer les timers
         iIDTimer1 = SetTimer(NULL,0,1000,Fonction1); // toutes les 1s
         iIDTimer2 = SetTimer(NULL,0,2000,Fonction2);
// toutes les 2s


Jean-François

lundi 7 avril 2008 à 15:21:21 | Re : question sur thread

SAKingdom

Membre Club
Le problème est que son application est de type console (d'après un post précédent). Utiliser les timers demande absolument une boucle à messages qui bloquera par conséquence le thread principal.

Cependant, dans une application console, bloquer le thread principal n'est, en général, pas très recommandé du fait que le déroulement de l'application ne dépend pas de messages interceptables par cette boucle à messages (à l'inverse d'une application GUI).

La seule solution donc, pour ne pas bloquer le thread principal (dans la probabilité qu'il en ai encore besoin) est de créer un second thread.

C++ (@++)

lundi 7 avril 2008 à 16:03:07 | Re : question sur thread

jfrancois

En effet si c'est une application console tout ça n'est pas terrible !

Mon cher elbok, il serait temps de passer à une "vraie" application win32 ! C'est pas si compliqué que ça en à l'air, surtout passé la rédaction de la première "carcasse" de programme (ça sera quasiment toujours le même point de départ pour tous les programmes). Ensuite on passe en revue, petit à petit, toutes les possibilités offertes par Windows via l'API Win32 ... et il y en a !

Jean-François



Cette discussion est classée dans : connexion, thread, procédure, verifier, appele


Répondre à ce message

Sujets en rapport avec ce message

verifier la connexion [ par LuckyNut ] Je voudrais savoir comment on fait pour vérifier qu'une connexion internet est en cours afin de demander à l'utilisateur de se connecter Thread et tubes [ par sordnil ] Bonjour,    Pour un projet j'ai besoin de faire communiquer deux thread entre eux : mon main() et un thread que je crée a partir de celui-ci.    Pour Socket et multithread. [ par mohdaef ] Bonjour à tous.Pour les besoins d'un petit jeu que je suis entrain de réaliser, j'ai besoin de créer un petit serveur pour la partir réseau du jeu. Ce Fonction Thread [ par morino1003 ] salut tout le monde.je veux faire une connexion entre host(mon pc) et un automate(Integra cobra 400).la connexion se fait par une liaison (demande/rep Aide sur les exceptions [ par victorcoasne ] Bonjour,Je fais un petit serveur multi-threadé : un thread par connection acceptée.Si par exemple j'ai un timeout il renvoie une exception de type cha Savoir si l'exécution du thread est terminée [ par ndubien ] Bonjour, Comment savoir si l'exécution de mon thread est terminée (=la fonction à terminée son exécution) : HANDLE hCrypter = CreateThread( NULL, 0, C Connexion à un serveur unix avec ftp [ par staik194118 ] Bonjour les amis je dois me connecter sur un serveur unix(bien particulier) depuis ma machine (ubuntu) et ce via une connexion ftp afin de récupé connexion a base donnees SQL server [ par gochti ] Bonjour;je suis debutant en C++ avec compilateur visual studio c++ 6.0.S il ya quelqu un qui peux m aider a creer la connexion a une base donnees sqls connexion builder c++ et sql server [ par morino1003 ] salut tout le monde je veux savoir est ce que je peux faire une connexion entre Builder 6 c++ et SQL server.La connexion est disponible avec ACCESS,MY fermer une thread qui est en attente fgets() en c sous windXP [ par dyroj ] Bonjour a tous,je n'arrive pas fermer une thread qui est en attende avec la fonction fgets(),thread a quitter :DWORD WINAPI Tsend_ms_t(LPVOID lpvoid){


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 0,468 sec (4)

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