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
// 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_
.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)
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ódulotime
. Aquí está el código Python actualizado:En este código, comenzamos definiendo una variable
start_time
para hacer un seguimiento de cuánto tiempo ha transcurrido. Luego, usamos un buclewhile
para recargar continuamente el móduloembeded
e imprimir el valor actual deargument.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 deargument.vehicle_id
con un intervalo de 1 segundo.Con estos cambios, llamar a
simplePrint(car1)
debería producir la salida deseada, imprimiendo1234
durante los primeros 2 segundos y luego imprimiendo4543
después de eso.