在我的main中声明一个对象并在单独的线程中运行它的功能后,我的程序崩溃。
我已经阅读了关于SO的其他问题,但是由于我缺乏多线程知识,所以我无法理解具体的问题。
这是我的类,称为UART(不包含头文件,仅显示所需的cpp声明):
$(document).on('turbolinks:load',function(){...})
我的主要cpp看起来像这样:
void UART::run()
{
while(true)
{
_letter = _serial.read();
if (_letter == "!")
{
_line = _serial.readline();
_words.clear();
std::istringstream f(_line);
std::string s;
//std::cout << _letter << std::endl;
while (getline(f,s,'\t'))
{
_words.push_back(s);
}
this->fillVars();
}
}
}
void UART::fillVars()
{
if (_words[0] == "s")
{
_effort[0] = std::stoi(_words[1]);
_effort[1] = std::stoi(_words[2]);
}
else if (_words[0] == "e")
{
this->convertToMeters();
}
}
void UART::convertToMeters()
{
std::cout << _position[0];
_position[0] = std::stod(_words[1]); // / _tick_meters;
_position[1] = std::stod(_words[2]) / _tick_meters;
}
double UART::getPosition(std::string wheel)
{
if (wheel == "LEFT") return _position[0];
else return _position[1];
}
我的理解是,创建对象int main(int argc, char** argv)
{
ros::init(argc, argv, "joint_node");
std::string port("/dev/ttyACM0");
unsigned long baud = 115200;
try
{
serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000));
if(my_serial.isOpen()) ROS_INFO("Serial is %s", "open");
genius::UART uart(my_serial, 380);
std::thread uart_run(&genius::UART::run, uart);
std::cout << uart.getPosition("LEFT") <<std::endl;
} catch (std::exception &e)
{
std::cerr << "Unhandled Exception: " << e.what() << std::endl;
}
return 0;
}
之后,我希望在单独的线程中运行其功能uart
,因为我希望其值在后台不中断的情况下进行更新。因此,每当像使用其函数run()
一样访问其值时,我都会获取最新的数据。我猜我不需要uart.getPosition("LEFT")
这个线程,因为我不想等待它,因为它永远不会结束。
但是由于某种原因,在调用.join()
之后,我的程序崩溃了,函数uart.getPosition("LEFT")
也从未执行过,并且我总是得到0值。