Функция выхода C ++ из другой функции - PullRequest
0 голосов
/ 19 октября 2018

Я создал класс для последовательной связи с функцией чтения.Я использую 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 
}

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Как насчет чтения в потоке (pthread_t thread_read;), а затем запуска таймера в другом потоке (pthread_t thread_timer;).

После желаемого периоба вы отменяете поток чтения (pthread_cancel(thread_read);)

0 голосов
/ 19 октября 2018

Если port_ - это обычный файловый дескриптор и , у вас есть POSIX, вы можете сначала позвонить select или poll на нем (последний немного проще в использовании), оба предоставляют возможность тайм-аута.

Зависит от устройства и операционной системы (вам придется читать документацию), ioctlдаже может позволить вам получить сколько данных доступно ...

0 голосов
/ 19 октября 2018

Можно ли выйти из функции F в C ++ из другой функции G?

Нет, но вы могли бы рассмотреть в теле G (вызвано из F) выбрасывание некоторые исключение перехват этого исключенияв F, в том же потоке)

Или отменить вызов функции чтения

Это зависит от операционной системы.В Linux вы можете использовать неблокирующий IO (и использовать poll (2) для определения доступности ввода, например, в цикле событий ).Вы также можете использовать асинхронный ввод-вывод.См. aio_read (3) и aio_cancel (3) .

...