es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

PYBIND11: Realizar cambios en el valor del objeto de la clase en otro hilo de c++ cuando el intérprete de Python está incrustado y en ejecución en otro hilo.

Estoy imprimiendo el valor de car1.vehicle_id en Python. Quiero que imprima “1234” durante los primeros 2 segundos y luego cuando el valor cambie en otro hilo a “4543”, el cambio debería afectar a Python. ¿Es posible o hay un ejemplo simple que me ayude con esto?

c++

#include #include
#include #include
// Definir espacio de nombres para pybind11
namespace py = pybind11;

class Vehiclee {
// Especificador de acceso
public:
Vehiclee() {};
~Vehiclee() {}
// Miembros de datos
int vehicle_id;
std::string vehicle_name;
std::string vehicle_color;

// Funciones miembro ()
void printname()
{
    std::cout << "Id del vehículo es: " << vehicle_id;
    std::cout << "Nombre del vehículo es: " << vehicle_name;
    std::cout << "Color del vehículo es: " << vehicle_color;
}

};

PYBIND11_EMBEDDED_MODULE(embeded, m) {
py::class_(m, “Vehiclee”)
.def_readonly(“vehicle_name”, &Vehiclee::vehicle_name)
.def_readonly(“vehicle_color”, &Vehiclee::vehicle_color)
.def_readonly(“vehicle_id”, &Vehiclee::vehicle_id);
}

py::scoped_interpreter python{};
Vehiclee car1;

void threadFunc()
{
sleep(2);
std::cout<<“entrando al hilo…”;
car1.vehicle_id = 4543;
std::cout<<“valor modificado en el hilo…”;
}

int main() {
// Inicializar el intérprete de Python
// Importar todas las funciones de los scripts por nombre de archivo en el directorio de trabajo
auto simpleFuncs = py::module::import(“simpleFuncs”);
// Probar si los objetos de C++ se pueden pasar a las funciones de Python
car1.vehicle_id = 1234;
std::thread t1(threadFunc);
simpleFuncs.attr(“simplePrint”)(car1);
t1.join();
return 0;
}

python

import time
import importlib
import embeded

def simplePrint(argument):
count = 0
while count < 2:
importlib.reload(embeded)
print(argument.vehicle_id)
time.sleep(1)
count += 1
print(argument.vehicle_id)

Salida actual

Siempre 1234

Salida requerida

1234 (durante los primeros 2 segundos)
4543 (después de 2 segundos)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para lograr la salida requerida, puedes modificar la función simplePrint en el código Python para incluir un temporizador utilizando el módulo time. Aquí está el código Python actualizado:

    import time 
    import importlib 
    import embeded
    
    def simplePrint(argument): 
        start_time = time.time()
        while True: 
            importlib.reload(embeded)
            print(argument.vehicle_id)
            if time.time() - start_time >= 2: # después de 2 segundos
                break
            time.sleep(1)
        while True:
            importlib.reload(embeded)
            print(argument.vehicle_id)
            time.sleep(1)
    

    En este código, comenzamos definiendo una variable start_time para hacer un seguimiento de cuánto tiempo ha transcurrido. Luego, usamos un bucle while para recargar continuamente el módulo embeded e imprimir el valor actual de argument.vehicle_id. Si el tiempo transcurrido es mayor o igual a 2 segundos, salimos del primer bucle y pasamos al segundo. En el segundo bucle, simplemente imprimimos el valor de argument.vehicle_id con un intervalo de 1 segundo.

    Con estos cambios, llamar a simplePrint(car1) debería producir la salida deseada, imprimiendo 1234 durante los primeros 2 segundos y luego imprimiendo 4543 después de eso.

Comments are closed.