从另一个函数退出C++函数
我已经创建了一个带有读取函数的串行链接类。 我使用boost::asio::read从串行链接读取数据。但是read函数会无限期地等待,直到收到一个字节 我想创建一个线程,如果由于系统出现故障而超过了最大等待时间,那么它将停止读取函数 < >可以从另一个函数中退出C++中的函数吗?或者取消另一个函数的读取函数调用从另一个函数退出C++函数,c++,function,call,exit,infinite,C++,Function,Call,Exit,Infinite,我已经创建了一个带有读取函数的串行链接类。 我使用boost::asio::read从串行链接读取数据。但是read函数会无限期地等待,直到收到一个字节 我想创建一个线程,如果由于系统出现故障而超过了最大等待时间,那么它将停止读取函数 < >可以从另一个函数中退出C++中的函数吗?或者取消另一个函数的读取函数调用 std::string SerialLink::read(const int maxTime) { std::string data; std::vector < uin
std::string SerialLink::read(const int maxTime) {
std::string data;
std::vector < uint8_t > buf;
const int readSize = 1;
try {
buf.resize(readSize);
//boost::asio::read waits until a byte has been received
boost::asio::read(port_, boost::asio::buffer(buf, readSize));
data = buf.front();
}
catch (const std::exception & e) {
std::cerr << "SerialLink ERROR: " << e.what() << "\n";
return -1;
}
return data();
}
void threadTime() {
//This function will keep track of the time and if maxTime has passed, the read function/function call must be cancelled and return -1 if possible
}
是否可以从另一个函数G?<中退出C++中的函数f?p>
不,但您可以考虑从f中调用的G的主体和在同一线程< /p>中的F中的异常。 或者取消读取函数调用
这是特定于操作系统的。在Linux上,您可以使用和来检测输入何时可用,例如在您的系统中。您还可以使用异步IO。请参阅和。如何在线程pthread\u t thread\u read;中进行阅读;,然后在另一个线程pthread\u t thread\u timer;中启动计时器 在所需的周期结束后,取消读取线程pthread\u cancelthread\u read 如果port_uu是一个普通的文件描述符,并且您有可用的POSIX,那么您可以首先调用它,或者在它上面调用后者,后者更易于使用,两者都提供了超时功能
特定于设备和操作系统您必须阅读文档,甚至可能允许您获取多少可用数据…很好,但特定于POSIX。我猜select在WinAPI上本机不可用。@BasileStrynkevitch Truth,应该提到。。。在WinAPI中可用,但仅适用于套接字…在我的情况下引发异常不起作用,因为函数G是线程函数。从线程抛出异常会终止程序。我没有事件循环,因为boost::asio::read是挂起的函数。我不想改变boost::asio::read函数。你可以在抛出它的同一线程中捕获异常是的,但这不是问题的解决方案,因为你仍然需要从G函数终止F函数。实际上,你可能需要一个事件循环,所以在Linux上使用poll