none
Métodos Threads con memoria compartida RRS feed

  • Pregunta

  • Hola

    Estoy desarrollando una aplicación en windows en donde requiero ejecutar 3 procesos de manera simultanea: _thread_EEG (adquisición), _thread_MachineLearning (procesamiento), _thread_Interface (interfaz). El segundo proceso depende de datos obtenidos por el primero, del mismo modo, el tercer proceso requiere la respuesta del segundo.

    La manera que estoy manejando el problema es definir dos variables de clase (_Shared_buffer, _Shared_label), a los que accederían los procesos.

    class uMotor{
    private:
            bool _busyBuffer;
    	bool _busyLabel;
     
    	Raw  _Shared_buffer;
    	char _Shared_label ;
    
    	uEEG _gtec;
    	Interface _screen;
    
    /*  
    	Methods
     */
            void _thread_EEG            (long endTime);
    	void _thread_MachineLearning(long endTime);
    	void _thread_Interface      (long endTime);
    
    public:
    	uMotor();
            void BCI();
            ~uMotor();
    };

    Los procesos los estoy ejecutando con la librería thread.h 

    void uMotor::BCI(){
    	const long NUM_SECONDS_RUNNING = 9;
    
    	long startTime = clock();
    	long endTime = startTime + NUM_SECONDS_RUNNING * CLOCKS_PER_SEC;
    
    	std::thread first (&uMotor::_thread_EEG            , endTime);
    	std::thread second(&uMotor::_thread_MachineLearning, endTime);
    	std::thread third (&uMotor::_thread_Interface      , endTime);
    }

    El resultado de la compilación arroja dos errores: 

    • Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)' uMotor c:\program files (x86)\microsoft visual studio 14.0\vc\include\thr\xthread 240
    • Error C2672 'std::invoke': no matching overloaded function found uMotor c:\program files (x86)\microsoft visual studio 14.0\vc\include\thr\xthread 240

    Cual podría ser el problema? 

    viernes, 6 de mayo de 2016 22:12

Todas las respuestas

  • No te lo puedo asegurar de memoria, pero creo que tienes que pasar el "this" del objeto como primer parámetro al  thread.

    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/

    lunes, 9 de mayo de 2016 14:33
    Moderador
  • Acabo de mirar un código antiguo y lo hago asi:

    m_thread=newstd::thread(this->StaticThreadFunction,this);

    StaticThreadFunction es un método estático de la clase que recibe el puntero del objeto que realmente tiene el método que sera el thread. El método estático es este, en donde ThreadFunciton es la función real que es el thread: 

    		static void StaticThreadFunction(EngineBase *pEngine) 
    		{
    			pEngine->ThreadFunction();
    		}

    Esto lo hago asi porque según creo, la STL no admite punteros a métodos en la creación de threads. De todos modos quizás podrias utilizar un functor (http://stackoverflow.com/questions/356950/c-functors-and-their-uses) o las "funciones" de C++ (http://en.cppreference.com/w/cpp/utility/functional/function).

    Es algo que no he probado para esto.

    Y ten en cuenta sincronizar la memoria compartida con algún tipo de mutex.


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/


    lunes, 9 de mayo de 2016 14:52
    Moderador