Partage
  • Partager sur Facebook
  • Partager sur Twitter

les Threads de l'Api win32

    9 août 2006 à 13:45:13

    bonjour a tous

    je vous éxplique :

    je suis en train de revenir sur le travail d'un developpeur qui a écrit une application serveur en C++
    -le bute de son appli est de ce connecter a une base de donnée durant toute son éxecution
    en plus de cela il y a une interface graphique

    -donc c'est une application multiThreads(multitaches)le probléme c'est qu'il n'a pas intégrer les Threads dans cette appli du coup quand la tache de fond est en exécution(connection a la BD) l'interface graphique freeze ou block quelque secondes a chaque click de souris sur l'interface (ex: pour remplir des champs de texte)

    -aprés avoir bien scruté les sources je constate qu'il utilise QT4 pour l'interface graphique et les cnx réseau. Je peut donc soit utilisé QT pour les Threads(mais je trouve ca trés difficile toute est en anglais ya pas trop de forum en francais et tous n'est pas trés claire avec QT),
    Ou je peut utilisé l'api Windows pour les Threads(ce que je veux utiliser)

    ***Mon probléme c'est que je n'avais jamais utiliser les Threads avant et je ne comprend pas trés bien comment les utilisé.
    -l'objectif des Threads lui est bien compris mon plus gros soucis est d'intégrer ca dans les classes déja existante.

    si quelqu'un peut m'aidé ca serais trés simpa
    et merci d'avance ... :):):)
    • Partager sur Facebook
    • Partager sur Twitter
      11 août 2006 à 10:15:24

      dommage personne ne me répond
      • Partager sur Facebook
      • Partager sur Twitter
        11 août 2006 à 10:27:12

        Pour créer un thread avec l'API Windows:

        DWORD dwId;
        HANDLE hThread=CreateThread(
            NULL,0,ThreadFunc,lpParam,0,&dwId);

        Et le code tu thread:

        DWORD WINAPI ThreadFunc(
          LPVOID lpParameter
        )
        {
           // lpParameter correspond à lpParam passé en paramètre à CreateThread
           // du code
           // ...
           return 0;
        }


        Pour le suspendre:
        SuspendThread(hThread);


        Pour reprendre l'exécution:
        ResumeThread(hThread);


        Pour créer un mutex:

        HANDLE hMutex=CreateMutex(NULL,FALSE,NULL);
        // pour aquérir le mutex dès la création, spéécifier TRUE au lieu de FALSE .


        Pour l'acquérir:

        WaitForSingleObject(hMutex,INFINITE);


        Pour le libérer:
        ReleaseMutex(hMutex);


        Si tu as besoin d'autre primitives de synchronisation, dis-le .
        • Partager sur Facebook
        • Partager sur Twitter
          11 août 2006 à 10:31:51

          Ca serait stupide d'utiliser l'API Win au lieu de Qt (plus de portabilité, pas d'interopérabilité entre les toolkits...). Pourquoi tu n'utilise pas les QThread ? La documentation est clair et il y'a un exemple qui parle de lui même : http://doc.trolltech.com/4.1/qthread.html
          • Partager sur Facebook
          • Partager sur Twitter
            11 août 2006 à 12:46:57

            Je ne suis pas d'accord : si son programme n'est destiné qu'à des machines windows, et s'il a juste besoin de la gestion des threads, il n'a pas forcément envie de se trimballer la dll de QT partout.

            Ou comment utiliser un tank pour tuer une mouche...
            • Partager sur Facebook
            • Partager sur Twitter

            If you'd like to join us, read "How do we work at OpenClassrooms"! :)

              11 août 2006 à 13:16:34

              AMHA mélanger des chameaux et des carottes c'est pas génial (donc mélanger API Win32 et Qt) de plus en comparant rapidement les deux approches il me semble que les threads de Qt sont plus facilemement utilisable et ca lui évite également d'encapsuler dans d'autre classe l'API Win32. (d'ailleurs Qt n'a pas de DLL, il est compilé statiquement dans l'application aux dernières nouvelles)
              • Partager sur Facebook
              • Partager sur Twitter
                11 août 2006 à 14:37:00

                Mea culpa, j'avais lu son message trop rapidement en effet.
                • Partager sur Facebook
                • Partager sur Twitter

                If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                  16 août 2006 à 11:23:48

                  ok merci les gars pour vos reponses

                  alors avec les QThread de qt je n'arrive pas a faire fonctionner mon programme

                  mais avec l'api windows j'arrive a crer des threads bidons (genre affiché en console pour voir si tou ce fait bien en méme tps)donc les threads marche trés bien .
                  mais kan je veux éxécuté une parti de ma fonction en passant par les thread ca plante

                  voici la fct:


                  void timerSlot()
                  {


                  qDebug()<<"in timerSlots\\n";

                  if (listWidget_list_tpe->currentRow() >= 0)
                  {
                  QString tpe;
                  tpe = listWidget_list_tpe->currentItem()->text();
                  listWidget_list_tpe->clear();
                  listWidget_list_tpe->addItems(db->getTpe());
                  QList<QListWidgetItem *> tpeList = listWidget_list_tpe->findItems(tpe, 0);
                  if (tpeList.size() > 0)
                  listWidget_list_tpe->setCurrentItem(tpeList[0]);
                  }
                  else
                  {
                  listWidget_list_tpe->clear();
                  listWidget_list_tpe->addItems(db->getTpe());
                  }

                  QStringList ip;
                  ip.clear();
                  ip = db->getNewTpe();
                  printf("taille ip =%d\\n",ip.size());
                  if (ip.size() > 0)
                  {

                  for (int i = 0; i < ip.size(); ++i)
                  {
                  ****************************************************************

                  if (ip[i] != db->getSecu())
                  {qDebug()<<"ici";
                  CClient *client = new CClient(ip[i], 10002, 10000);
                  if (client->connection())
                  {
                  QString res = client->sendGetIdentifiant();
                  QString test;
                  test.setNum((unsigned char)res[14].toAscii());
                  if ((unsigned char)res[14].toAscii() == 1)
                  {
                  int i = res[11].toAscii() * L'\\x100' + res[12].toAscii();
                  QString num;
                  db->addTpe(client->getIp(), num.setNum(i));
                  }
                  else
                  {
                  int i = res[11].toAscii() * L'\\x100' + res[12].toAscii();
                  QString num;
                  db->addTpe(client->getIp(), num.setNum(i));
                  res.remove(0, 11);
                  res.remove(res.size() - 4, 3);
                  db->updateIdent(res.split(13));
                  }
                  }
                  delete client;
                  }
                  **********************************************************************************************
                  }
                  }
                  printf("end\\n");
                  }




                  ce que je veux c'est que la parti qui est entre les lignes d'étoile soit géré par un thread
                  mais comme je vous les dis plus haut ca plante a la compile.


                  en autre chose si ca peut vous aidé pour créer un thread bidon dans cette classe qui contient cette fonction je suis obligé de méttre le mot clé static devant la fonction



                  static DWORD WINAPI Thread2(LPVOID lpParam)
                  {

                  while(1)
                  {
                  printf("processus en cour \\n");
                  Sleep(500);
                  }
                  return 0;
                  }


                  ---------------------------------------------------------------------------------

                  kan le thread est de ce genre la (ci-dessus) ca passe
                  mais des que je veux utilisé la pati qui est entre les 2 lignes d'etoile ca plante

                  merci les gars de votre et j'espére avoir était claire









                  LA BALISE CODE, MERCI !!!
                  </span></span>
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 août 2006 à 12:36:13

                    • Utilise la balise code.
                    • Indente ton code.


                    Ca fait deux conditions pour qu'on jette un coup d'oeil à ton code.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 août 2006 à 9:11:40

                      y a t'il tjrs quelqu'un ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 août 2006 à 11:58:07

                        salut a tous

                        j'ais donc trouvé la solution

                        j'ais adobté qt4

                        en utilisant la classe Qthread

                        faire donc hérité ma classe de celle-ci.

                        voici un lien http://doc.trolltech.com/4.0/qthread.html
                        • Partager sur Facebook
                        • Partager sur Twitter

                        les Threads de l'Api win32

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown