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*)’|

次の 3 つのファイルがあります。次の 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

ただし、エラー メッセージで主張されている asではなく、pthread_create()実際にはvoid*(*)(void*)as 引数を取るため、何かが正しくないように見えます:を使用して、スレッド エントリ関数に情報を渡すことができます。適切なメンバー関数を呼び出す前に、正しい型に変更します。void*(*)(void)void*

于 2013-09-15T22:39:40.950 に答える
0

スレッド化で非静的メソッドを使用することはできません。インスタンス対応のメソッドをマルチスレッド化するには、次のパターンを使用する必要があります。

baseclass.h

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

baseclass.cpp

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

main.cpp

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