0

C++ でプログラムを作成しており、インクルードvector型が必要ですHilo--> vector<Hilo>( Hilohilo の属性自体を変更する boost::thread を含むクラスです。) cpp でagregarHilo。vector の作成で何が問題になっていますか? 私はこれらの方法でそれを作成しようとしました: 1.

  Hilo * hil = new Hilo(this->contadorHilos,tiempo_vida);
    vecHilos.push_back(hil);

または 2. (前述のように、ベクトルはagregarHiloOperaciones.cpp のメソッドで作成されます。ここに完全なコードがあります) ありがとうございます。

//file: Hilo.h    
#ifndef HILO_H   
#define HILO_H1    
#include <boost/thread.hpp>   
#include <boost/date_time.hpp>    
#include <string>    
using namespace std;    
class Hilo{    
private:    
    int id;    
    string mensaje;    
    int tiempo_vida;    
    boost::thread hilo;    
public: void accion();    
        Hilo(int,int);    
        ~Hilo();    
        void setId(int);    
        int getId() const;    
        void setTiempoVida(int);    
        int getTiempoVida() const;    
        string getMensaje() const;    
};//endif    

//file: Hilo.cpp    
#include "Hilo.h"    
#include <iostream>
Hilo::Hilo(int id,int tiempo_vida){    
    this->id=id;    
    this->tiempo_vida=tiempo_vida;    
    this->hilo=boost::thread(&Hilo::accion,this);}    
Hilo::~Hilo(){}    
void Hilo::accion(){    
    unsigned a=1;    
    boost::posix_time::seconds velocidad_(a);    
    while (this->tiempo_vida>=0){    
        stringstream sstm;    
        sstm<<"Hilo numero:"<<this->id <<" tiempo de vida restante:"<<(this->tiempo_vida--);    
        this->mensaje=sstm.str();    
        boost::this_thread::sleep(velocidad_);}    
}    
void Hilo::setId(int id){    
    this->id=id;}    
int Hilo::getId() const{    
    return this->id;}    
void Hilo::setTiempoVida(int tiempo_vida){    
    this->tiempo_vida=tiempo_vida;}    
int Hilo::getTiempoVida() const{   
    return this->tiempo_vida;}    
string Hilo::getMensaje() const{    
    return this->mensaje;}    

//file: Operaciones.h   
#ifndef OPERACIONES_H    
#define OPERACIONES_H1    
#include "Hilo.h"    
#include <vector>
class Operaciones{    
private:    
    int contadorHilos;
    vector<Hilo> vecHilos;    
public:    
    Operaciones();    
    void agregarHilo(int);    
    void verHilo(int);    
};#endif    

    //file: Operaciones.cpp    
    #include "Operaciones.h"    
    Operaciones::Operaciones(){    
        this->contadorHilos=0;}    
void Operaciones::agregarHilo(int tiempo_vida){    
    vecHilos.push_back(Hilo(this->contadorHilos,tiempo_vida); 
    this->contadorHilos++;    
}    
void Operaciones::verHilo(int hilo){} //en construccion    

//file: Principal.cpp    
#include <iostream>    
#include <cstdlib>    
#include "Operaciones.h"    
using namespace std;    

int main(){    
    bool run=true;    
    int opcion;    
    Operaciones oper;    
    system("clear");    
    while(run==true){    
        cout<<"APLICACION MULTI-HILO\nDigite alguna de las opciones\n1. Crear nuevo hilo\n2.Observar hilo\n3. Salir\n";    
        cin>>opcion;    
        switch(opcion){    
        case 1:    
            system("clear");    
            cout<<"Se va a crear un nuevo hilo\n";    
            cout<<"Digite el tiempo de vida del hilo(segundos)";    
            int tiempo;    
            cin>>tiempo;    
            oper.agregarHilo(tiempo);    
            cout<<"Se ha agregado correctamente";    
            break;    
        case 2:    
            system("clear");    
            cout<<"Se va a observar un hilo\n";    
            break;    
        case 3:    
            system("clear");    
            cout<<"Fin del programa, gracias\n";    
            run=false;   
            break;    
        default:    
            system("clear");    
            cout<<"La opcion que ingreso es incorrecta\n";    
            break;    
        }    
        sleep (1.1);    
        system("clear");    
    }    
    return 0;    
}    
4

1 に答える 1

0

あなたの問題は行にあると思いますvecHilos.push_back(Hilo(this->contadorHilos,tiempo_vida));。この行では、新しいconst Hiloオブジェクトを作成しています。これは、 の後ろにコピーされvecHilosます。

クラスのほとんどは問題なくコピーできますが、コピーboost::threadはできません。

boost::thread クラスは、スレッドの起動と管理を担当します。各 boost::thread オブジェクトは、単一の実行スレッドまたは Not-a-Thread を表し、最大で 1 つの boost::thread オブジェクトが特定の実行スレッドを表します。タイプ boost::thread のオブジェクトはコピーできません。

コードから のすべてのインスタンスを削除することで、この動作を確認できるboost::threadはずです。その後、正常にコンパイルされるはずです (他のエラーがない限り)。

この場合、独自のコピー (または移動) コンストラクターを作成しHilo、スレッドのコピー/移動を処理する必要があります。例(テストされておらず、おそらく最良の解決策ではない):

// Move constructor
Hilo::Hilo(Hilo&& old)
  : id(_hilo.id), mensaje(_hilo.mensaje), tiempo_vida(_hilo.tiempo_vida),
    hilo(std::move(_hilo.hilo)) {}
于 2013-09-01T02:33:16.823 に答える