puedo usar hilo en función de miembro para llamar a una función miembro de C++ en windows? Si sí, cómo ponerlo en práctica? Aquí está la muestra

void Class::fun_1(void){
 _beginthread(fun_2, 0, NULL); //This is the error line :: function call missing argument list; use '&Class::fun_2' to create a pointer to member
}

void Class::fun_2(void){
 printf("hello");
}

Gracias

InformationsquelleAutor Ian | 2011-08-24

2 Comentarios

  1. 7

    En realidad, hay varias cuestiones aquí:

    1. Que no puede pasar un puntero a una función miembro como la rutina de la _beginthread() función. La función requiere un puntero a una función global o estática.
    2. Estándar de C++ requiere que usted califica totalmente el nombre de función miembro (incluso dentro de la clase) y el uso de un & para obtener un puntero a miembro (el compilador se quejaba acerca de este punto).

    Porque no se puede pasar de un miembro de la función de puntero a _beginthread(), usted necesita para crear un contenedor global o función estática para hacer que funcione. Aquí es una manera de hacer que eso suceda:

    class MyClass
    {
    public:
        void fun_1()
        {  
            _beginthread(&MyClass::fun_2_wrapper, 0, static_cast<void*>(this));
        }
    
    private:
        void fun_2()
        {
            printf("hello");  
        }  
    
        static void __cdecl fun_2_wrapper(void* o)
        {
            static_cast<MyClass*>(o)->fun_2();
        }
    };

    Por supuesto, necesita de alguna manera garantiza que el MyClass objeto seguirá existiendo mientras fun_2() se está ejecutando, o no tan buenas cosas va a suceder. Si mucho no tiene que preocuparse por ello, considerar el uso de Boost.Hilo que hace básicamente es esto y mucho más para usted.

    • Si fun_2 tendrá acceso a algunas de parámetro, por ejemplo, anular fun_2(){ charString = «abc»; //charString es un miembro privado de la Clase}, entonces para un fun_2, esta no es una función miembro. Es capaz de acceso directo?
    • todavía debe ser capaz de acceder a los miembros de la clase porque fun_2() todavía es un miembro de la función de MyClass. fun_2_wrapper() hay que _beginthread() puede llamar a su hilo de rutina.
  2. 5

    La forma habitual de hacer esto es utilizar una función miembro estática que llama a la función miembro utilizando un puntero nulo para el objeto original.

    class Class
    {
    public:
       void fun_1(void)
       {
          _beginthread( &Class::static_fun_2, 0, this );
       }
       void fun_2(void)
       {
          printf("hello");
       }
    private:
       static void static_fun_2( void * args )
       {
          static_cast<Class*>(args)->fun_2();
       }
    
    };

    Sin embargo, si se empiezan a necesitar para pasar argumentos a las funciones que las cosas se ponen un poco más complicadas. Me gustaría estudiar el uso de boost::hilo y boost::bind en lugar de rodar su propio.

    • Se puede utilizar boost::bind o std::bind directamente con _beginthread con lo que pasar de la necesidad de una función estática?
    • Yo no creo que se pueda utilizar la une directamente ya que estás pasando argumentos a _beginthread que deben ser de un determinado tipo de función. Sin embargo, usted puede crear un contenedor para _beginthread en el estilo de boost::thread que aceptará más general de funciones, permitiendo el uso de bind.

Dejar respuesta

Please enter your comment!
Please enter your name here