Повысьте аварийную программу ASIO Async_receive - PullRequest
0 голосов
/ 14 сентября 2018

По большей части моя программа работает нормально, но иногда она падает.Если я сделаю паузу в середине программы, она также вылетит.Любое понимание того, почему будет высоко ценится!Я думаю, что это может быть связано с тем, что async_read_some вызывается несколько раз, прежде чем он действительно выполняется.

Main.cpp:

while(true)
{
    sensor->update();

    if (sensor->processNow == 1)
    {
        sensor->process(4);
        sensor->processNow = 0;
        sensorReadyForUpdate = 1;
    }   
}

Конструктор:

sensorHandler::sensorHandler(std::string host, int port, std::string name) :
socket_(ioservice_),
sensorAddress_(boost::asio::ip::address::from_string(host), port),
dataRequested_(false),
dataReady_(false)
{

}

Функция обновления:

bool sensorHandler::update()
{
ioservice_.poll_one();
if (inOperation == false)
{

    inOperation = true;

    socket_.async_read_some(boost::asio::buffer(receiveBuffer, receiveBuffer.size()), boost::bind(&sensorHandler::receiveCallback, this, _1, _2));
    return success;
}

}

Функция обратного вызова приема:

bool sensorHandler::receiveCallback(const boost::system::error_code& error, std::size_t bytes_transferred)
{
    std::cout << "success - in receiveCallBack" << std::endl;
    processNow = 1;
    inOperation = false;
}

Включает в себя:

#include "sensorHandler.h"
#include <boost\bind.hpp>
#include <boost\asio\write.hpp>
#include <iostream>
#include <windows.h>

Файл заголовка:

class sensorHandler
{
public:
    sensorHandler(std::string host, int port, std::string name);
    ~sensorHandler();
    bool connect();
    bool update();
    boost::array<char, 400000> receiveBuffer;  // was 50000
}

1 Ответ

0 голосов
/ 14 сентября 2018

Возможно, я упускаю суть вопроса, но является ли вопрос, что вы хотите запустить асинхронную операцию в цикле?

Классическим способом достижения этого является цепочка вызовов, поэтому в завершенииОбработчик ставит в очередь следующую операцию:

bool IFMHandler::receiveCallback(const boost::system::error_code& error, std::size_t bytes_transferred)
{

    /*code to process buffer here - ends with processNow = 1 and inOperation = false*/

    if (!error) {
        socket_.async_read_some(boost::asio::buffer(receiveBuffer, 
            receiveBuffer.size()), boost::bind(&IFMHandler::receiveCallback, this, _1, _2));
    }
}

Итак, теперь вы можете просто вызвать

ioservice_.run(); 

и цепочка запустится сама.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...