begin process at 2012 05 29 12:58:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Multi tâches


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

Multi tâches

mardi 17 mai 2005 à 11:43:25 | Multi tâches

El Rabou

Bonjour
je cherche a faire un thread qui soit une méthode d'un objet celle-ci étant non statique.
Le tout en Visual C++ 6. Bien sûr j'ai trouvé l'astuce de passer la fenêtre en paramètre au thread, mais cela ne me satisfait pas pour des raisons de design UML.
J'utilise actuellement CreateThread( ) pour créer le thread ce n'est peut etre de la que vient le problème (CreateThread n'accepte que les méthodes statiques ? ) .
Je suis preneur de toute suggestion.
Merci

C'est le manque de foi qui rend fous les hommes...
mardi 17 mai 2005 à 11:51:30 | Re : Multi tâches

Arnotic

Administrateur CodeS-SourceS
Comment veux-tu créer un thread sur une fonction qui n'a pas d'adresse mémoire fixe (donc non statique) ?
C'est physiquement impossible. Donc il faut que ce soit une fonction statique tout comme pour les callbacks.

@+
Arnotic,
Admin CS, MVP Visual C++
mardi 17 mai 2005 à 12:01:10 | Re : Multi tâches

vecchio56

Administrateur CodeS-SourceS
En ce qui me concerne j'ai du mal à comprendre pourquoi ca ne marchepas, une méthode étant juste une fonction normal prenant en plus enparamètre (implicite) un objet. Cela a-t-il un rapport avec l'héritageet les méthodes virtuelles?
mardi 17 mai 2005 à 12:19:17 | Re : Multi tâches

ymca2003

Justement ce paramètres implicite empêche les callback d'être appelées car il faut fournir le pointeur this que l'API Win32 est incapable de deviner lors de l'appel à la fonction CALLBACK. Le seul moyen serait de lui fournir en paramètre ce pointeur ce qui est tout de même possible car en général on peut fournir un param en plus de la CALLBACK que le prog peut reconvertir en pointeur sur l'objet. La CALLBACK peut ensuite appeler une fonction membre. Il faut obligatoirement passer par cette étape...

mardi 17 mai 2005 à 12:31:52 | Re : Multi tâches

Arnotic

Administrateur CodeS-SourceS
Pour créer une callback ou un thread il te faut une adresse mémoire fixe pour une fonction à la compilation. Hors en C++ avec les class tu n'as plus ca. Donc tu es obligé de définir statique si tu veux en avoir un.

@+
Arnotic,
Admin CS, MVP Visual C++
mardi 17 mai 2005 à 13:33:24 | Re : Multi tâches

vecchio56

Administrateur CodeS-SourceS
Oui ymca je comprends, pourtant l'adresse d'une fonction membre est bien fixe, je vois pas comment elle pourrait varier.
En fait le problème de compilation survient quand le compilo se rendcompte que la fonction est une fonction membre non-static, je me trompe?

mardi 17 mai 2005 à 14:17:20 | Re : Multi tâches

cosmobob

salut,
Arnotic: une methode non statique d'une classe a une adresse fixe (saufsi la fonction est virtuelle). Le truc c'est qu'une methode nonstatique recoit en plus implicitement la valeur du pointeur this (quiest passé a travers ecx ou edx d'ailleurs).
El Rabou: Cree une fonction static de la forme la:
class test
{
   static int functhread(test* param)
  {
       if (!param)
          return 0;
       test& theObject = *param;
       // mtnt theObject designe l'objet que tu avais créé
       // etc...

       return 1;
}
si ton design uml foire, c'est que il y a quelque chose de malconcu.... de toute facons faire ceci est perilleux car entre temps;theObject peut ne plus exister dans le thread principal ou il a étécréé... donc dans ton diagramme il faut bien s'assurer que sa durée devie est plus grande que celle du thread (peut etre est-ce un singleton,et qu'il dure pdt tout le prog ?)

a+

mardi 17 mai 2005 à 14:20:22 | Re : Multi tâches

El Rabou

En faite, il y a plusieurs manieres de compiler la techno objet. Le truc, c que je c pas comment visual c++ si prend. Liste chainer de pointeur de fonctions ?  decalage ? si quelqu'un pouvait me dire où je peut trouvé ça ... ça m'aiderait à comprendre se qu'il fait, et donc comment il compile, et donc, bien des erreurs. Je ne l'ai pas vue dans la msdn. C'est pourtant le genre de truc façile à trouvé sur d'autre compilo c++ (je vien du monde de l'info indus... et sur microcontroleurs ces informations sont capital et donc spécifié dans les doc)

Merci de votre aide.

C'est le manque de foi qui rend fous les hommes...
mardi 17 mai 2005 à 14:34:46 | Re : Multi tâches

ymca2003

Les méhodes non statiques des classes ont bien une adresse fixée à l'édition de lien (il suffit de générer le .map pour le voir).
Le compilo passe simplement un pointeur sur l'objet appelant en param supplémentaire de la méthodes (dans le registre ecx pour x86).

Pour les méthodes non virtuelles on appelle donc simplement la méthode comme n'importe quelle autre fonction.

Pour les méthodes virtuelles c'est différent. Chaque classe ayant au moins une méthode virtuelle possède une table contenant l'addresse des fonctions virtuelles. Cette table est initialisée à la construction de l'objet en fonction de sa véritable classe.
Ainsi 2 objets de 2 classes différentes mais dérivant d'une même classe auront des implémentations différentes pour une méthode virtuelle mais cette méthode sera accessible par le même indice dans la table. Tout ça c'est le compilo qui s'en charge.

Les implémentations des méthodes virtuelles ont bien sûr une addresse fixe connue à l'édition de lien. Cette addresse est mise dans la vtable lors de la construction de l'objet. C'est juste au momemt de l'appel que le compilo passe par la table virtuelle pour récupéper l'adresse de la fonction correspondante à la classe du Runtime. plutot que d'appeler directement la fonction.
mardi 17 mai 2005 à 14:48:45 | Re : Multi tâches

cosmobob

j'ai pas bien pigé ta question mais j'essaie d'y repondre :)
si tu passes une fonction non statique comme parametre d'un thread, pourquoi cela ne compile t'il pas?
tout simplement parce que la convention d'appel de ta methode nonstatique de ta classe n'est pas la meme que celle d'une fonction'classique'. Les parametres de la fonction/methode sont bien mis sur lapile, mais dans le cas d'un appel d'une fonction membre non statique,le compilateur (vc 6 du moins)  stocke dans edx la valeur dupointeur this, puis appelle la methode "normalement".
en gros si tu ecris ceci:

class test
{
private:
std::string message;
public:
   void SetMessage(const char* nvomessage)
   {
       message = nvomessage;
    }
}

test ObjetTest;
ObjetTest.SetMessage( "salut !");

que se passe t'il a ce moment?
pour appeler SetMessage, le compilo place l'adresse de ObjetTest dansedx, puis il empile l'adresse de la chaine "salut !" sur la pile, et lail appelle la fonction SetMessage.
A l'interieur de cette fonction, le compilo peut connaitre l'adresse dustd::string message de l'objet ObjetTest, car celui ci se retrouvefacilement a partir de l'adresse de this qui est contenue dans edx (ilest par exemple a l'adresse edx, ou edx+4, ou ... tout depend del'existence ou non d'autres champs dans la classe)
Mais maintenant si j'ai une fonction quelconque:
void DireBonjour(const char* msg)
{
std::cout << "bonjour : " << msg << endl;
}

Pour appeler cette fonction, pas besoin de remplir edx... c'est pas une fonction membre d'une classe.

Si tu appelles CreateThread, le compilo t'empeche de passer unefonction non statique, car CreateThread ne va pa toucher a edx qui doitpourtant imperativement contenir le pointeur this avant l'appel d'unefonction membre non statique. Il n'y touche pas, car d'habitude il n'ya pas besoin d'y toucher ...

tu peux feinter en faisant ca:

class test
{
   static int functhread(test* param)
  {
       if (!param)
          return 0;
       test& theObject = *param;
       // mtnt theObject designe l'objet que tu avais créé
       theObject.AppelFuncThreadNonStatique();
       // etc...

       return 1;
    }
    void AppelFuncThreadNonStatique(void)
    {
       // ce que tu veux ... c 'est pas ici une fonction statique
    }
}

void main
{
test ObjetTest;
DWORD ThreadId = 0;
CreateThread(NULL,  NULL, test::functhread, &ObjetTest, NULL, &ThreadId);
Sleep(INFINITE);
}
et voila si j'ai pu t'eclairer ....


1 2 3

Cette discussion est classée dans : thread, multi, tâches, createthread


Répondre à ce message

Sujets en rapport avec ce message

Multi thread ? tuto? [ par MoDDiB ] Je cherche des tutos pr une appli basé sur winsock donc il me fo po mal de thread mais.. j'ai jamais utilisé ca !! alors ou ke c'est que je pourrais t Class & CreateThread [ par Renfield ] Bonjour, j'ai un petit soucis de compilation...dans une classe, je voudrais créer un Thread. ma proc est définie comme cela :LPTHREAD_START_ROUTINE multi-thread [ par bk263249 ] Bonjour,Je travaille sur un code C++ qui contient un thread qui gere la detection d'une carte dans un lecteur.Depuis que je suis passe de VC++5 a VC++ multi thread avec librairie phtread -> help please [ par davwart ] Hello all.j'essaie de faire un chat en mode console en utilisant la librairie pthread.h.mon serveur a une fonction main qui lance un thread d'ecoute e monitoring d'une application multi-thread [ par bigzooloo ] Bonjour, J'ai créé une application multi-threads qui utilise des librairies, égalements, multi-threads. J'aurai voulu savoir s'il était possible de s thread [ par dev_hy ] voila je veux utiliser les threads sous windows. alors j'ai crée un classe thread, dans la méthode de créeation de thread toute est bon mais il m'affi Tutoriel MFC et Multi-threading [ par lolochacha ] Salut à tous, j'aimerais comprendre un peu plus le mécanisme de création/gestion des threads dans des applications MFC. Exemples de question que je me PROBLEME DE THREAD (CreateThread -->ERROR) [ par neub ] Salut à tous, j'ecris un module de visionnement d'image etje souhaiterai pouvoir stopper ma fonction OnPlay au moment voulu mais j'ai un pb a la creat multi process, multi thread [ par hobbes ] Bonjour,je cherche quels sont les avantages et les inconvennients entre le multi thread et le multi process lorsque l on programme en C++ sous visual. socket single-thread multi-thread [ par katsankat ] Salut :) Pour un serveur, quelqu'un sait-il en quelles circonstances il faut favoriser le single-thread, et quels sont les avantages du multi-thread?


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

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,686 sec (4)

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