0

我来自哥伦比亚,所以错误是西班牙语。这似乎是获得答案最快的地方......

我一直在尝试制作一个简单的程序来创建线程并将信息保存在向量中,但是当我构建代码时,会出现下一个错误:

...Lanzador.cpp|19|error: no se puede convertir ‘void* (Hilo::*)(void*)’ a ‘void* (*)(void*)’ para el argumento ‘3’ para ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’|

我有三个文件:Hilos 的标题,上面写着:

    #ifndef HILO_H
    #define HILO_H
    using namespace std;

    class Hilo
    {
        public:
            Hilo();
            virtual ~Hilo();
            void addHilo(int);
            void* ImprimirHilo(void*);

        protected:
        private:
        };

    #endif // HILO_H

Hilo.cpp 说:

    #include <iostream>
    #include <vector>
    #include <cstdlib>
    #include <pthread.h>
    #include <unistd.h>
    #include "Hilo.h"
    using namespace std;
    vector<int> info (1);
    Hilo::Hilo()
    {
    //ctor
    }

    Hilo::~Hilo()
    {
     //dtor
    }

    void Hilo::addHilo(int tiempo){

         info.push_back(tiempo);

    }


    void* Hilo::ImprimirHilo(void *threadid)
    {
         long tid;
         tid = (long) threadid;
        int n =info.at(tid);
        for (int i=n; i>0; i-- ){
        info.at(tid)=i;
        cout << "El hilo numero: " << tid << " tiene " << i <<" segundos"<< endl;
        sleep(1);
        }
        pthread_exit(NULL);
      }

以及具有主要 Lanzador.cpp 的类

    #include <iostream>
    #include <cstdlib>
    #include <pthread.h>
    #include "Hilo.h"
    using namespace std;
    int main (){
        Hilo h;
        pthread_t threads;
        int tiempo=0;
        int rc;
        int contador=0;
        cout << "Para salir oprima 0 \n"<<endl;
        cout << "Escriba el tiempo del hilo" << endl;
        while (true){
            cin >> tiempo;
            if (tiempo>0){
                contador++;
                h.addHilo(tiempo);
                rc = pthread_create(&threads, NULL,&h.ImprimirHilo, (void*)contador);
                if (rc){
                     cout << "Error:unable to create thread," << rc << endl;
                     exit(-1);
                }
           }
      }


      pthread_exit(NULL);

   }

我希望你们能帮助我。抱歉英语不好,感谢您的帮助

4

2 回答 2

1

根据错误消息中提到的签名,您正在尝试使用需要void()函数或其指针的成员函数:直接使用成员函数将不起作用!你需要意识到一个表面上没有参数的成员函数实际上有一个隐藏的参数:this指针!因此,需要提供一个对象。由于您使用pthread_create()没有任何解决方法:您需要提出一个不带参数的普通函数。由于可能需要声明该函数,因此extern "C"您也不能使用static成员函数。

然而,有些事情似乎不正确,因为pthread_create()实际上将 avoid*(*)(void*)作为参数,而不是void*(*)(void)错误消息中声称的 a:void*可用于将信息传递给线程入口函数,例如,指向可以恢复的对象的指针在调用合适的成员函数之前转换为正确的类型。

于 2013-09-15T22:39:40.950 回答
0

您不能在线程中使用非静态方法。您将必须使用以下模式来获取实例感知方法的多线程。

基类.h

class baseclass
{
    int a;
    static void __stdcall threaded(void* params);
}

基类.cpp

void __stdcall 
threaded(void* params)
{
    // this is your class instance
    pThis = static_cast<baseclass*>(params);
    printf("%d", pThis->a);
}

主文件

// class instance is entered as the parameter
rc = pthread_create(&threads, NULL, Hilo::ImprimirHilo, (void*)&h);
于 2013-09-15T22:40:10.230 回答