none
Método de uma thread como membro de uma classe RRS feed

  • Pergunta

  • Olá pessoal, estou tentando criar threads em uma aplicação usando a prórpia API da microsoftf (windows.h). Mas estou com um problema, pois é gerado um error de compilação. e eu nao sei porque isso ocorre. Aqui está o erro:

    "

    Error 1 error C3867: 'Truco::playerThread': function call missing argument list; use '&Truco::playerThread' to create a pointer to member c:\users\belitos\documents\visual studio 2008\projects\truco\truco.cpp 180 Truco"

     

    Truco.h

     

    #ifndef TRUCO_H
    
    #define TRUCO_H
    
    
    
    #include "Deck.h"
    
    #include "Player.h"
    
    #include "Group.h"
    
    #include <windows.h>
    
    
    
    #define NUMBER_OF_PLAYERS 4
    
    #define MAX_POINTS 12
    
    
    
    //DWORD WINAPI playerThread( LPVOID );
    
    
    
    
    
    
    
    class Truco
    
    {
    
    public:
    
    	Truco();
    
    	Truco(char *[]);
    
    	void start();
    
    	Player * getPlayers() { return players; }
    
    
    
    
    
    
    
    private:
    
    	Deck deck;
    
    	HANDLE threadArray[NUMBER_OF_PLAYERS];
    
    	DWORD dwThreadIdArray[NUMBER_OF_PLAYERS];
    
    	Player players[NUMBER_OF_PLAYERS];
    
    	Card manilha;
    
    	Group group1;
    
    	Group group2;
    
    
    
    	/*
    
    		metodos
    
    	*/
    
    	void giveCardToPlayers();
    
    	void checkManilha();
    
    	void changePoints(const char *,const char *);
    
    	DWORD WINAPI playerThread( LPVOID );
    
    
    
    };
    
    
    
    
    
    
    
    #endif
    
    

    Truco.cpp (Trecho de codigo)

     

    DWORD WINAPI Truco::playerThread(LPVOID args)
    
    {
    
    
    
    	
    
    	HANDLE hStdout;
    
     int value = reinterpret_cast<int>(args);
    
    
    
     cout << value << "\n";
    
    
    
     return 0; 
    
    
    
    }
    
    
    Porque eu recebo esse erro? para min está tudo normal.
    
    
    Obrgiado
    
    

     

    sábado, 24 de julho de 2010 03:58

Todas as Respostas

  • Olá Íscaro,

    Este é um problema clássico. Todo membro do tipo função tem como primeiro parametro escondido o ponteiro this.

    Ou seja, sua função playerThread(LPVOID args) é resolvido para playerThread(Truco* this, LPVOID args). Para resolver este problema vc pode:

    1. Transformar playerThread para static, caso vc não necessite usar os membros da instância dentro desta thread.

    2. Caso vc precise acessar a instância dentro desta thread vc precisará:

    2.1 Criar uma funcão estatica que possa ser usada por CreateThread, passando como argumento o this

    2.2 Esta função estática redirecionará para a função instanciada

    2.3 CreateThread chama a função estática passando em args o this.

    Algo deste tipo (em pseudo codigo):

    class Truco
    {
    ...

    public:
      static DWORD WINAPI threadFunc( LPVOID args )
      {
        Truco* self = reinterpret_cast<Truco*>( args );
        self->playerThread();
      }

    };


    ...

    CreateThread( ..., &Truco::threadFunc, this );

     


    Fabio Galuppo
    segunda-feira, 26 de julho de 2010 13:26