2015-06-03 81 views
0

登录后,我的程序需要等待4秒钟,然后在写入分数前检查玩家是否仍然登录。我调用该函数作为异步之一:具有参数的异步C++ WaitForSeconds函数

std::async (scoreAttendance, p); //p = pointer to player 

这是我的函数:

void scoreAttendance(player *p) 
{ 
    time_t beginT = time(NULL); 
    time_t endT = time(NULL); 
    while(difftime(endT, beginT) < p->attendingTime){ 
     endT = time(NULL);} 
    if (p->user != NULL){ 
     sendScore(saveScore);} 
} 

但它没有这样做异步,它挡住了整个程序持续4秒。我做错了什么?


附加信息: 该程序运行在游戏服务器上。如果连接的RFID侦听器读取新的RFID,它会通过TCP/IP向游戏服务器通知此登录信息。

//TCP Server handles the received data 
void session::handle_read(const boost::system::error_code& error, 
          size_t bytes_transferred) 
{ 
    [...] 
    std::vector<char> response = 
       packet.process(data_, bytes_transferred, ip); 
    [...] 
} 

//This leads to the process function 
void process(datapacket& gamedata) 
{ 
    std::string command = gamedata.getvalue("command"); 
    PROCESS_COMMAND(u,"plug/rfid/read", loginStation); 
    [...] 
} 

//process calls this login function 
void loginStation(datapacket& gamedata) 
{ 
    [...] 
    //Identifies the User by his RFID 
    [...] 
    std::async (scoreAttendance, p); 
    return; 
} 
+0

目前,您的问题没有给出足够的信息来诊断问题。你可以在你调用std :: async的地方添加一些上下文吗?以[mcve](http://stackoverflow.com/help/mcve)向我们展示问题将是理想的。 – PeterSW

回答

0

问题是TCP侦听器在它自己的线程中,所以异步调用并没有阻塞主线程,而是阻塞了侦听线程。 我们通过在明确的参加时间计数器线程中强制计数器并将两个线程的共享方法标记为scope_locked来解决此问题,以防止双重访问相关问题。

boost::mutex m; 
void method(datapacket& data) 
{ 
    boost::mutex::scoped_lock l(m); 
    [...] 
-1

按照该文档:所接收到的数据在一个调用异步scoreAttendance()一个LoginFunction处理

行为与异步(标准::发射::异步| STD: :launch :: deferred,f,args ...)。换句话说,f可以在另一个线程中执行,也可以在查询结果std :: future时同步运行。

您是否在异步调度之前的任何时间查询生成的std::future

+0

我没有结果,我只是希望它等待x秒而不会阻塞程序的其余部分,然后执行某些操作。我最初的std :: async是错误的吗? –

+0

因此,根据您的编辑,可能这是您正在寻找的内容:http://stackoverflow.com/questions/10804683/delayed-function-call – alediaferia

+0

它也不工作。它仍然阻止其他服务器功能。我认为我的初始函数调用不是异步的。如果我调用'std :: async(scoreAttendance,p); std :: cout <<“Login done”<< std :: endl;'在异步调用完成所有事情完成后它将打印cout。 –