CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Thread

Pseudo supprimé
Pseudo supprimé 21 septembre 2009 à 18:14:23

Salut, salut !

J'ai fait un essaie et faut que je puisse utilisé des thread et des fonctions placés dans des class (pas clair, pas clair)

Exemple :

"#include <iostream>

  1. include <pthread.h>

using namespace std;

class Test{

public:
Test(){}
~Test(){}

void* Proj(void * data);

};

void* Test::Proj(void *data){
cout<<"test";
}

int main()
{
int i;

Test Test2;

pthread_t thread;// On crée un thread
pthread_create(&thread, NULL, Test2.Proj, NULL);// Permet d'exécuter le fonction maFonction en parallèle

// Attend la fin tu thread créé
pthread_join(thread, NULL);
return 0;
}"

j'ai ce message d'erreur :
\main.cpp|29|error: argument of type `void*(Test::)(void*)' does not match `void*(*)(void*)'|

Quelqu'un à une idée pour régler le soucis ? :ouch: Je cherche depuis 4 heures maintenant et : nada <_< que des exemples en C

merci et @bientôt.

dnob700
dnob700
Niveau 10
21 septembre 2009 à 18:30:57

C'est du au mixage C/C++. En effet, la fonction pthread_create attend un pointeur de fonction qui prend un void* en paramètre. Or, ce n'est pas le cas de la fonction Test.Proj, qui est une fonction membre d'une classe et qui a un premier paramètre "caché" qui est le pointeur vers l'instance de sa classe (this). Je ne sais pas s'il y a un moyen d'obtenir un pointeur "normal" pour cette fonction (je crois avoir lu quelque part que oui, mais je me demande si ce n'est pas dans la norme 0x). Le plus simple est de créer une autre fonction en dehors de ta classe du genre :

void* Proj2(Test* t)
{
t->Proj();
}

Que tu appelerais dans le pthread_create avec en argument le pointeur vers l'instance de ta classe.

Pseudo supprimé
Pseudo supprimé 21 septembre 2009 à 18:43:03

J'ai fait ce que tu as dit et conseiller et j'ai le même message d'erreur :(

Je passe pourtant dans une fonction :(

dnob700
dnob700
Niveau 10
22 septembre 2009 à 00:42:05

colle ton code (et cast le pointeur de la fonction vers void*(*)(void*) s'il prend un Test* en argument).

Pseudo supprimé
Pseudo supprimé 22 septembre 2009 à 03:34:11

Je ne sais pas quoi faire là :(

Le code en ce moment :

class MaClass{

public:
MaClass(){}
~MaClass(){}

void Test(){cout<<"La fonction Test() Fonctionne";}
};

void* Fonction4(MaClass * test){
//test->Test();

return 0;
}

int main()
{
int i;

MaClass Class;

pthread_t F3;
pthread_create(&F3, NULL, Fonction4, (void*)Class);

for(i=0 ; i<50 ; i++)
printf("1");

pthread_join(F3, NULL);
return 0;
}

"

:( le nouveau message d'erreur :
main.cpp||In function `int main()':| main.cpp|36|error: cannot convert `Class' from type `MaClass' to type `void*'|
||=== Build finished: 1 errors, 0 warnings ===|

dnob700
dnob700
Niveau 10
22 septembre 2009 à 10:04:32

Il faut caster le pointeur de fonction comme je te l'ai écris plus haut et en plus Class n'est pas un pointeur mais une instance, donc il faut passer son adresse dans pthread_create :

pthread_create(&F3, NULL, (void*(*)(void*)Fonction4, (void*)&Class);

Pseudo supprimé
Pseudo supprimé 22 septembre 2009 à 15:41:09

ok ! J'avais pas compris sa comme ça ! Je pensais que je devait faire ainsi : # pthread_create(&F3, NULL, Fonction4, (void*)(*)&Class));

Ok, thx pour l'info et l'astuce sa marche à présent :(

merci :D

tbop2
tbop2
Niveau 10
23 septembre 2009 à 10:46:10

J'ai eu le même problème que toi à l'époque. Un enseignant calé m'avait donné une autre astuce. Déclarer en static la fonction threadée de la classe.

dnob700
dnob700
Niveau 10
23 septembre 2009 à 11:00:13

oui, ça fonctionne aussi, principalement parce qu'une fonction static n'est pas vraiment une fonction membre (sauf en apparence) et ne reçoit donc pas de pointeur "this". Mais ce n'est possible que si les fonctionnalité de la fonction peuvent être séparé du reste de celle de la classe.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment