我为带有读取功能的串行链接创建了一个类。 我使用boost :: asio :: read从串行链接读取数据。但是读取功能会无限期等待,直到接收到一个字节为止。
我想创建一个线程,如果经过了最大等待时间(由于系统出现故障),该线程将停止读取功能。
是否可以从另一个函数中退出C ++中的一个函数?还是取消其他功能的读取功能调用?
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
}
答案 0 :(得分:1)
是否可以从另一个函数G中退出C ++中的函数F?
否,但是您可以考虑在G主体(从F中调用)throwing中的一些exception(和catching在同一线程中的F中的异常)
或取消读取函数调用
这是特定于操作系统的。在Linux上,您可以使用non-blocking IO(并使用poll(2)来检测何时有可用的输入,例如在event loop中)。您也可以使用异步IO。参见aio_read(3)和aio_cancel(3)。
答案 1 :(得分:1)
如何在一个线程(pthread_t thread_read;
)中阅读,然后在另一个线程(pthread_t thread_timer;
)中启动计时器。
在所需的橄榄石之后,您取消了读取线程(pthread_cancel(thread_read);
)
答案 2 :(得分:1)