[英]Boost ASIO Async_receive crashing program
在大多數情況下,我的程序運行良好,但有時會崩潰。 如果我在運行中暫停程序,它也會崩潰。 關於為什么的任何見解將不勝感激! 我認為這可能是由於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
}
我可能遺漏了問題的要點,但是您是否想在循環中運行異步操作的問題?
實現此目標的經典方法是通過調用鏈接,因此在完成處理程序中,您可以加入下一個操作:
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();
連鎖店將自行運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.