17 / 19 / 4
Регистрация: 03.02.2010
Сообщений: 246
1

Перенос кода на версию 1.82

06.08.2023, 12:33. Показов 2415. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток коллеги! Безуспешно пытаюсь перенести код на новую версию boost 1.82, в версии 1.60 код работал...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <boost/asio/serial_port.hpp> 
#include <boost/asio/deadline_timer.hpp>
#include <boost/asio/placeholders.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/asio/io_context.hpp>
#include <boost/bind.hpp>
 
class blocking_reader
{
    boost::asio::serial_port& port;
    size_t timeout;
    char c;
    boost::asio::deadline_timer timer;
    bool read_error;
 
    // Called when an async read completes or has been cancelled
    void read_complete(const boost::system::error_code& error,
        size_t bytes_transferred) {     
 
            read_error = (error || bytes_transferred == 0);
 
            // Read has finished, so cancel the
            // timer.
            timer.cancel();
    }
 
    // Called when the timer's deadline expires.
    void time_out(const boost::system::error_code& error) {
 
        // Was the timeout was cancelled?
        if (error) {
            // yes
            return;
        }
 
        // no, we have timed out, so kill
        // the read operation
        // The read callback will be called
        // with an error
        port.cancel();
    }
 
public:
 
    // Constructs a blocking reader, pass in an open serial_port and
    // a timeout in milliseconds.
    blocking_reader(boost::asio::serial_port& port, size_t timeout) :
      port(port), timeout(timeout),
          timer(port.get_io_service()),
          read_error(true) {
 
      }
 
      // Reads a character or times out
      // returns false if the read times out
      bool read_char(char& val) {
 
          val = c = '\0';
 
          // After a timeout & cancel it seems we need
          // to do a reset for subsequent reads to work.
          port.get_io_service().reset();
 
          // Asynchronously read 1 character.
          boost::asio::async_read(port, boost::asio::buffer(&c, 1), 
              boost::bind(&blocking_reader::read_complete, 
              this, 
              boost::asio::placeholders::error, 
              boost::asio::placeholders::bytes_transferred)); 
 
          // Setup a deadline time to implement our timeout.
          timer.expires_from_now(boost::posix_time::milliseconds(timeout));
          timer.async_wait(boost::bind(&blocking_reader::time_out,
              this, boost::asio::placeholders::error));
 
          // This will block until a character is read
          // or until the it is cancelled.
          port.get_io_service().run();
          
 
          if (!read_error)
              val = c;
 
          return !read_error;
      }
};
Подскажите пожалуйста где теперь находятся следующие функции (в новой версии они больше не доступны):

timer(port.get_io_service())
port.get_io_service().reset();
boost::asio::async_read(port, boost::asio::buffer(&c, 1)
port.get_io_service().run();
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2023, 12:33
Ответы с готовыми решениями:

Перенос кода в новую версию
Доброго времени суток. Поставлена задача перенести лабораторные работы с матлаба 2012 в матлаб...

Перенос проекта на другую версию
Всем привет! Такая проблема: есть проект, но он сделан на версии 24.6.1. Открыть его не получается...

Перенос проекта на новую версию
Подскажите пожалуйста как перенести проект с одной версии RAd Studio на другую. К примеру с Xe7 на...

Перенос проекта в другую версию Embarcadero
Сабж - сделал проекта в Embarcadero 10 Rio, установленной на Win 7 64. Понадобилось продолжить...

4
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,775
06.08.2023, 16:02 2
al072, чтоб переделать нормально, ножен контекст, в котором используется этот класс.
По сабжу:

Цитата Сообщение от al072 Посмотреть сообщение
port.get_io_service()
C++
1
port.get_executor().context()
но это не совсем то же самое.

Цитата Сообщение от al072 Посмотреть сообщение
boost::asio::async_read
C++
1
#include <boost/asio/read.hpp>
Цитата Сообщение от al072 Посмотреть сообщение
reset()
run()
Это нужно делать в вызывающем коде, который управляет асинхронным контекстом.
1
17 / 19 / 4
Регистрация: 03.02.2010
Сообщений: 246
06.08.2023, 16:10  [ТС] 3
Цитата Сообщение от zayats80888 Посмотреть сообщение
Это нужно делать в вызывающем коде, который управляет асинхронным контекстом.
Большое спасибо за ответ, последнее пояснение не совсем понял, можете подробней объяснить как вызвать методы Run() и Reset()?
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,775
06.08.2023, 16:20 4
Лучший ответ Сообщение было отмечено al072 как решение

Решение

Цитата Сообщение от al072 Посмотреть сообщение
можете подробней объяснить как вызвать методы Run() и Reset()?
Второй вызывать смысла не вижу, а как и где - я же говорю, нужно видеть весь контекст использования этого класса.

Но можете попробовать тупо адаптировать под 1.82, не меняя окружения.
Вот, например, компилируется, но будет ли работать и работать корректно, я не знаю:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <boost/asio/serial_port.hpp> 
#include <boost/asio/deadline_timer.hpp>
#include <boost/asio/placeholders.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/asio/io_context.hpp>
#include <boost/bind/bind.hpp>
#include <boost/asio/read.hpp>
 
class blocking_reader
{
    boost::asio::serial_port& port;
    size_t timeout;
    char c;
    boost::asio::deadline_timer timer;
    bool read_error;
 
    // Called when an async read completes or has been cancelled
    void read_complete(const boost::system::error_code& error,
        size_t bytes_transferred) {     
 
            read_error = (error || bytes_transferred == 0);
 
            // Read has finished, so cancel the
            // timer.
            timer.cancel();
    }
 
    // Called when the timer's deadline expires.
    void time_out(const boost::system::error_code& error) {
 
        // Was the timeout was cancelled?
        if (error) {
            // yes
            return;
        }
 
        // no, we have timed out, so kill
        // the read operation
        // The read callback will be called
        // with an error
        port.cancel();
    }
 
public:
 
    // Constructs a blocking reader, pass in an open serial_port and
    // a timeout in milliseconds.
    blocking_reader(boost::asio::serial_port& port, size_t timeout) :
      port(port), timeout(timeout),
          timer(port.get_executor()),
          read_error(true) {
 
      }
 
      // Reads a character or times out
      // returns false if the read times out
      bool read_char(char& val) {
 
          val = c = '\0';
 
          // After a timeout & cancel it seems we need
          // to do a reset for subsequent reads to work.
          static_cast<boost::asio::io_service&>(port.get_executor().context()).reset();
 
          // Asynchronously read 1 character.
          boost::asio::async_read(port, boost::asio::buffer(&c, 1), 
              boost::bind(&blocking_reader::read_complete, 
              this, 
              boost::asio::placeholders::error, 
              boost::asio::placeholders::bytes_transferred)); 
 
          // Setup a deadline time to implement our timeout.
          timer.expires_from_now(boost::posix_time::milliseconds(timeout));
          timer.async_wait(boost::bind(&blocking_reader::time_out,
              this, boost::asio::placeholders::error));
 
          // This will block until a character is read
          // or until the it is cancelled.
          static_cast<boost::asio::io_service&>(port.get_executor().context()).run();
          
 
          if (!read_error)
              val = c;
 
          return !read_error;
      }
};
1
17 / 19 / 4
Регистрация: 03.02.2010
Сообщений: 246
06.08.2023, 18:18  [ТС] 5
Цитата Сообщение от zayats80888 Посмотреть сообщение
Вот, например, компилируется, но будет ли работать и работать корректно, я не знаю:
Спасибо большое я потестирую и отпишусь

Добавлено через 1 час 26 минут
Еще раз благодарю, работает))
0
06.08.2023, 18:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2023, 18:18
Помогаю со студенческими работами здесь

Перенос проекта на более новую версию IDE
Хочется заранее задать вопрос - как правильно, и без особых последствий, перенести проект с старой...

Joomla: перенос сайта на новую версию движка
А при переносе сайта на новую версию позиции в выдаче упадут сильно? И на какую версию...

Перенос на новые домен и новую версию движка
Подскажите, люди добрые. Планирую предпринять следующие действия: 1) Перенос сайта с домена...

Перенос баз данных на более новую версию сервера
1. Есть программа Акцент, которая использует базы данных на Microsoft® SQL Server® 2008 R2. (Win 7)...

Opera AC. Перенос настроек и сохранённых страниц в другую версию
Всем привет.Моей опереАС уже несколько лет. Переносил её в установленном состоянии с ХР на ВИСТУ,...

Перенос проекта на более старую версию Visual Studio (2022 -> 2019)
Добрый вечер! Мне необходимо перенести проект, с которым работали на VS 2022, на компьютер с VS...

Проблема в переносе кода на 5 версию андройда
Доброго времени суток. Пишу webview приложение, взял за основу код: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru