如何通知我的用户尚未完成阅读?

时间:2016-11-23 21:55:49

标签: c++ c++11 boost-asio

我有一个类,它封装了与使用Asio读取和写入通用流套接字相关的所有业务逻辑。我想添加一个标志,以便我的用户知道他们是否可以从getter中检索数据,或者我们是否还在等待后端。

这通常是怎么做的?写入后将标志设置为忙,并在单独的线程中在后台执行读取操作?该标志与PQisBusy

类似

2 个答案:

答案 0 :(得分:2)

不知道您是否在寻找异步解决方案,例如使用回调或轮询方法。从问题看,您似乎正在寻找一种轮询方法,因为您需要一个标记,用户可以检查数据是否已完全准备好。在这种情况下,只需在类中定义变量和函数,.h文件:

#include <atomic>
#include <thread>    

class MySocket
{
public:
   ~MySocket();
   bool IsReady();
   void StartDataGather();    
private:
   void GatherDataThread();
   static std::atomic<bool> _isReady;
   std::thread _thread;
}

在你的.cpp文件中:

#include "MySocket.h"

static std::atomic<bool> MySocket::_isReady(false); // Default flag to false.

MySocket::~MySocket()
{
    // Make sure to kill the thread if this class is destroyed.
    if (_thread.joinable())
        _thread.join();
}

bool MySocket::IsReady() { return _isReady; }

void MySocket::StartDataGather()
{
    _isReady = false; // Reset flag.

    // If your gather thread is running then stop it or wait for it
    // to finish before starting it again.
    if(_thread.joinable())
        _thread.join();

    // Start the background thread to gather data.
    _thread = std::thread(GatherDataThread());
}

void MySocket::GatherDataThread()
{
    // This is your thread that gathers data.
    // Once all of the data is gathered, do the following:
    _isReady = true;
}

要从客户端类外部使用此方法,请执行以下操作:

MySocket mySock;

mySock.StartDataGather();

while(!mySock.IsReady())
{
    // Do some other code here until data is ready.
    // Once the MySocket::GatherDataThread() finishes it will
    // set _isReady = true which will cause mySock.IsReady() to
    // return true.
}

您现在有一个其他人可以检查的标志,由于std::atomic<>模板,它是线程安全的。以下使用C ++ 11或更新版-std=c++11

答案 1 :(得分:0)

如果用户是指用户的库,我建议将异步方法的结果包装在std::future或类似的线程同步机制中。您可以使用wait_for方法失败并通知该过程仍在进行中,然后重试。