2015-06-03 80 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。 –