Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/37: Рейтинг темы: голосов - 37, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57

Как вызвать метод из статической функции?

20.02.2022, 22:15. Показов 7780. Ответов 72
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Запускаю таймер:
C++
1
2
3
4
5
6
7
8
9
10
   struct sigaction sa;
   struct itimerval timer;
   memset(&sa, 0, sizeof(sa));
   sa.sa_handler = &StartTimer;
   sigaction(SIGALRM, &sa, NULL);
   timer.it_value.tv_sec = 0;
   timer.it_value.tv_usec = 25000;
   timer.it_interval.tv_sec = 0;
   timer.it_interval.tv_usec = 25000;
   setitimer(ITIMER_REAL, &timer, NULL);
Функция StartTimer может быть статической либо объявлена вне класса. Как из StartTimer мне можно вызвать метод класса?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.02.2022, 22:15
Ответы с готовыми решениями:

Как вызвать метод класса из static функции
Есть класс, 1 из функции которого создает поток на статичную функцию этого же класса, а эта статичная функция вызывает уже не статичную...

Как вызвать переопределить метод из дочернего класса так, чтобы выполнялись еще функции в родительском
У меня структура такова: Интерфейс IKey (Содержит void Open) public interface IKey { public void Open(); } Есть...

Объявление статической переменной и статической функции в классе
Добрый вечер, столкнулся с проблемой и не могу решить. Есть класс SavingsAccount и в нем объявлена статическая переменная для процентной...

72
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
25.02.2022, 15:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от John Prick Посмотреть сообщение
В винде например перед чтением из порта надо дождаться события прихода байта.
В неблокирующем режиме для этого есть системный вызов poll. В Qt событие от файлового дескриптора можно было бы интегрировать (QSocketNotifier) в общий цикл ожидания (хотя там и свой Serial есть, но все-таки), в wxWidgets видимо придется делать отдельный поток для этого.
В блокирующем режиме сам read будет держать контекст исполнения до прихода данных.
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
05.03.2022, 14:04  [ТС]
Понесла меня нелегкая в boost::asio.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void SerialPort::ReadBegin()
{
 
   
     m_serial_port.async_read_some(boost::asio::buffer(m_read_buffer,sizeof(m_read_buffer)),boost::bind(&SerialPort::ReadComplete, this,
            boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));
 
    std::cout<<"read begin  " << std::endl;
}
 
void SerialPort::ReadComplete(const boost::system::error_code& error,size_t bytes_transferred)  //const boost::system::error_code &ec, size_t bytesTransferred
{
  
    std::cout<<"reading port"<<std::endl;
    ReadBegin();
}
Не работает у меня m_serial_port.async_read_some.
Взял отдельно
C++
1
boost::bind(&SerialPort::ReadComplete, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred);
Тоже не вызывается функция, компилятор ошибок не дает.
Функция вызывается если из нее убрать аргументы и вызывать таким синтаксисом:
C++
1
boost::bind(&SerialPort::ReadComplete, this)();
со вторыми скобками.
Если у функции оставить аргументы и вызвать
C++
1
boost::bind(&SerialPort::ReadComplete, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)();
то компилятор дает ошибку.
0
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
05.03.2022, 15:51
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
C++
1
boost::asio::buffer(m_read_buffer,sizeof(m_read_buffer))
Во-первых, что есть m_read_buffer? Во-вторых, надо читать документацию, возможно обработчик не будет вызван пока не прочитает size байт.

Цитата Сообщение от Vlad_V9 Посмотреть сообщение
C++
1
boost::bind(&SerialPort::ReadComplete, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred);
Тоже не вызывается функция, компилятор ошибок не дает.
Здесь ничего и не должно вызываться. Точнее тут вызывается функция boost::bind, которая возвращает функциональный объект. Но так как её результат ничему не присвоен, то видимого эффекта никакого нет.

Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Если у функции оставить аргументы и вызвать
C++
1
boost::bind(&SerialPort::ReadComplete, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)();
то компилятор дает ошибку.
Потому что тут в функцию нужно ещё передать параметры
C++
1
boost::bind(&SerialPort::ReadComplete, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)(0, 0);
Добавлено через 29 минут
Ну и просто read_some работает?
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
05.03.2022, 16:08  [ТС]
Code
1
Во-первых, что есть m_read_buffer?
C++
1
std::vector<unsigned char> m_read_buffer;
Code
1
 Во-вторых, надо читать документацию, возможно обработчик не будет вызван пока не прочитает size байт.
Об этом не подумал.
Code
1
Точнее тут вызывается функция boost::bind, которая возвращает функциональный объект. Но так как её результат ничему не присвоен, то видимого эффекта никакого нет.
Функциональный объект должен вызваться?
Code
1
Ну и просто read_some работает?
Нет читать никаким боком пока не получается, запись вроде проходит.
0
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
05.03.2022, 16:46
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Функциональный объект должен вызваться?
Конечно.

Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Нет читать никаким боком пока не получается, запись вроде проходит.
А как порт инициализируется?
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
05.03.2022, 17:16  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool SerialPort::Open()
{
    std::string s="/dev/ttyUSB0";
    try
    {
            m_serial_port.open(s);
            std::cout<<"open port ok"<<std::endl;
            return true;
    }
    catch (const std::exception &m_error_code)
   {
 
    std::cout<<"Error open port"<<std::endl;
    return false;
   }
 
}
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
bool SerialPort::Initialize()
{
    try
    {
        m_serial_port.set_option(serial_port_base::baud_rate(m_baud_rate));
        m_serial_port.set_option(serial_port_base::character_size(m_data_bits));
        if (m_parity == g_Parity_None)  m_serial_port.set_option(serial_port_base::parity(serial_port_base::parity::none));
        if (m_parity == g_Parity_Odd)   m_serial_port.set_option(serial_port_base::parity(serial_port_base::parity::odd));
        if (m_parity == g_Parity_Even)  m_serial_port.set_option(serial_port_base::parity(serial_port_base::parity::even));
        if (m_stop_bits == g_StopBits_1)   m_serial_port.set_option(serial_port_base::stop_bits(serial_port_base::stop_bits::one));
        if (m_stop_bits == g_StopBits_1_5) m_serial_port.set_option(serial_port_base::stop_bits(serial_port_base::stop_bits::onepointfive));
        if (m_stop_bits == g_StopBits_2)   m_serial_port.set_option(serial_port_base::stop_bits(serial_port_base::stop_bits::two));
        if (m_flow_control == g_Handshaking_Off)       m_serial_port.set_option(serial_port_base::flow_control(serial_port_base::flow_control::none));
        if (m_flow_control == g_Handshaking_Hardware)  m_serial_port.set_option(serial_port_base::flow_control(serial_port_base::flow_control::hardware));
        if (m_flow_control == g_Handshaking_Software)  m_serial_port.set_option(serial_port_base::flow_control(serial_port_base::flow_control::software));
        std::cout<<"Setting port ok"<<std::endl;
        return true;
    }
    catch (const std::exception &m_error_code)
    {
        std::cout<<"Error setting port"<<std::endl;
        return false;
   }
}
C++
1
2
3
4
m_data_bits(8),
   m_stop_bits(g_StopBits_1),
   m_parity(g_Parity_None),
   m_flow_control(g_Handshaking_Off),
0
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
05.03.2022, 20:58
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
C++
1
m_serial_port.open(s);
А создаётся как?

По памяти точно не скажу, но там ещё перед созданием порта должно быть что-то в духе
C++
1
2
3
boost::asio::io_service srv;
boost::asio::serial_port port(srv);
srv.run();
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
05.03.2022, 21:40  [ТС]
Обявление:
C++
1
2
3
4
5
6
7
8
9
10
class SerialPort  
{
    public:
        
    protected:
 
    private:
   
   boost::asio::io_service      m_service;
   boost::asio::serial_port     m_serial_port;
Конструктор
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SerialPort::SerialPort():
   m_initialized(false),
   m_busy(false),
   m_baud_rate(115200),
   answerTimeoutMs_(500),
   refCount_(0),
 
   m_data_bits(8),
   m_stop_bits(g_StopBits_1),
   m_parity(g_Parity_None),
   m_flow_control(g_Handshaking_Software),
   
   pThread_(0),
   verbose_(true),
   m_serial_port(m_service)
Добавлено через 2 минуты
Цитата Сообщение от John Prick Посмотреть сообщение
srv.run();
Нет там run

write работает.

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
void SerialPort::Write(const unsigned char *buffer, size_t bufferLength)
{
 
    boost::asio::write(m_serial_port, boost::asio::buffer(buffer, bufferLength));
   //m_serial_port.write_some(boost::asio::buffer(buffer, bufferLength));
 
 
  
}
0
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
05.03.2022, 21:58
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Нет там run
Да есть: https://www.boost.org/doc/libs... rvice.html https://www.boost.org/doc/libs... t/run.html
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
05.03.2022, 22:39  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
Да есть: https://www.boost.org/doc/libs... rvice.html https://www.boost.org/doc/libs... t/run.html
Попутал немного, да есть извиняюсь. Добавил, не помогло.
0
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
05.03.2022, 22:59
Неплохо было бы посмотреть каким-нибудь монитором порта, приходит там что-нибудь вообще или нет.

Добавлено через 11 минут
Вот пример есть: https://gist.github.com/yoggy/3323808
Там в комментах момент:
I ran into a serious bug in start() which stopped it ever receiving data because io_service_.run() was returning before it was given any work to do. The fix is to call async_read_some_(); before creating the thread and calling run():
C++
1
2
3
4
5
// <...>
async_read_some_();
std::thread t( [this] () {this->io_service_.run(); });
thread_.swap(t);
// <...>
Т.е. сначала запустить асинхронное чтение, а только потом m_io_service.run();. Ну и это запускается в отдельном потоке.
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
05.03.2022, 23:05  [ТС]
Да приходит. Замкнул сам на себя. Терминал посылки видит.
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
07.03.2022, 00:56  [ТС]
Событие прихода байта.Причем событие происходит раньше чем данные поступают в буфер драйвера порта ос.Читать нужно с задержкой.
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
void SerialPortLinux::Init()
{
        m_saio.sa_handler = signal_handler_IO;
        sigemptyset (&m_saio.sa_mask);
        m_saio.sa_flags = 0;
        m_saio.sa_restorer = NULL;
        sigaction(SIGIO,&m_saio,NULL);
        /*
          разрешаем процессу получать SIGIO
        */
        fcntl(m_fd, F_SETOWN, getpid());
 
        /*
          делаем файловый дескриптор асинхронным (страница руководства
          говорит, что только O_APPEND и O_NONBLOCK будут работать
          с F_SETFL...)
        */
        fcntl(m_fd, F_SETFL, FASYNC);
 
        tcgetattr(m_fd,&m_oldtio); /* save current port settings */
 
        /*
          устанавливаем новые установки порта для обработки канонического ввода
        */
        m_newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //| CRTSCTS
        m_newtio.c_iflag = IGNPAR | ICRNL;
        m_newtio.c_oflag = 0;
       //m_newtio.c_lflag = ICANON;
        m_newtio.c_cc[VMIN]=0;
        m_newtio.c_cc[VTIME]=1;
        tcflush(m_fd, TCIFLUSH);
        tcsetattr(m_fd,TCSANOW,&m_newtio);
        printf("Init potr.\n");
 
}
C++
1
2
3
 int m_fd;
        struct termios m_oldtio,m_newtio;
        struct sigaction m_saio;
signal_handler_IO функция вне класса.

C++
1
2
3
4
5
6
void signal_handler_IO(int status)
{
//  int res = read(m_fd,m_rx_buf,255);
  printf("received SIGIO signal.\n");
  boost::bind(&SerialPortLinux::Read, SerialPortLinux())();
}
Вызывает метод не через объект а через класс.

Добавлено через 44 минуты
поспешил радоваться, вызов
C++
1
read(m_fd, m_rx_buf, 255)
через внешнюю функцию уходит в ошибку. Через объект класса из main все нормально.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void SerialPortLinux::Read()
{
 
    printf( "Start read.\n");
    
    int rd_static = read(m_fd, m_rx_buf, 255);
    if (rd_static>0)
    {
 
        printf( "%s \n", m_rx_buf);
 
    } else if(rd_static == 0)printf("No read data \n");
    else printf("Error read data \n");
}
0
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
07.03.2022, 01:05
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Вызывает метод не через объект а через класс.
Не очень понимаю, что вы тут имели в виду. Но здесь:
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
C++
1
boost::bind(&SerialPortLinux::Read, SerialPortLinux())();
вызывается Read для только что созданного объекта. SerialPortLinux() - это вызов конструктора, который создаст объект, к которому будет привязан вызов Read внутри bind.
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
07.03.2022, 01:16  [ТС]
Цитата Сообщение от John Prick Посмотреть сообщение
вызывается Read для только что созданного объекта. SerialPortLinux() - это вызов конструктора, который создаст объект, к которому будет привязан вызов Read внутри bind.
Да я уже это понял.Понял что ошибка. Я все пытаюсь как то добиться вызова метода внутри класса. Интересно в конструкторе нельзя получить адрес объекта?
0
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
07.03.2022, 01:19
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Интересно в конструкторе нельзя получить адрес объекта?
Какого объекта? Самого себя? - this.
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
07.03.2022, 01:34  [ТС]
Ага, да все получилось. БОЛЬШОЕ СПАСИБО.
C++
1
2
3
4
SerialPortLinux::SerialPortLinux()
{
    adress = this;  
}
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
class SerialPortLinux
{
    public:
        SerialPortLinux();
        virtual ~SerialPortLinux();
        bool Open();
        void Close();
        void Init();
        void Write(char* buff);
        void Read();
 
    protected:
 
    private:
        int m_fd;
        struct termios m_oldtio,m_newtio;
        struct sigaction m_saio;           /* объявление действия сигнала (signal action) */
        char m_rx_buf[255];
        char* m_tx_buffer;
        bool m_flag_rx;
 
};
 
void signal_handler_IO(int status);
static SerialPortLinux* adress;
C++
1
2
3
4
5
void signal_handler_IO(int status)
{
  printf("received SIGIO signal status = %d.\n", status);
 adress->Read();
}
signal_handler_IO вызывается событием поступления в порт данных.
0
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
07.03.2022, 10:37
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Ага, да все получилось.
В таком случае лучше использовать паттерн singleton. Смысл примерно тот же, что и у вас, но даёт гораздо меньше шансов для ошибок. Почитайте.
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 57
07.03.2022, 10:49  [ТС]
А если понадобиться работать с несколькими портами?
0
2410 / 1946 / 764
Регистрация: 27.07.2012
Сообщений: 5,582
07.03.2022, 11:14
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
А если понадобиться работать с несколькими портами?
В вашем коде это тоже слабо осуществимо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.03.2022, 11:14

Как вызвать метод info в метод Main и с какими параметрами?
я новичок в C#, так что не судите строго.. Я не думаю что это кому-то покажется сложным, но у меня вызывает дикий ступор(( using...

Метод main и как им вызвать другой метод
Доброго всем времени суток. У меня возникла проблема. Вобщем дело такое. У меня есть тестовый класс Test, в котором существует 4 метода:...

Шаблоны: определить класс в функции и вызвать его метод
Здравствуйте форумчане. Есть два класса: class WSelectionBox { public: WSelectionBox() = default; ...

Как мне вызвать переменную находящуюся в функции Thread3() из функции main(), находящейся в функции Thread2()
Вот код: from DataBase_0_2_0 import * import json import pyttsx3 import os import sys import speech_recognition as sr ...

Как присвоить адрес статической typedefined функции?
Дано: class NCodeHook { //.. template &lt;typename ArchT&gt; template &lt;typename U&gt; U NCodeHook&lt;ArchT&gt;::createHook(U...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки Правым кликом по серверу -> отладочная информация -> edit Заменить "net": "raw", на "net": "tcp", Нажать кнопку reload.
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru