2009-11-23 8 views
0

J'ai un script lua qui a une tâche longue comme obtenir une page web donc je la fais céder alors le handle de code C obtient le job de page async, donc le thread libre pour faire un autre job et après un time time voyez le travail sur la page get terminé, si c'est le cas, reprenez le script. le problème est que le thread ne peut pas reprendre le travail après l'attente asynchrone. voici mon code, je rippés à partir d'une classe donc un peu en désordre désoléImpossible de reprendre le fichier après async_wait?


////script: 
function Loginmegaupload_com(hp, user, pass, cookie) 
    setURL(hp, "http://megaupload.com/?c=login") 
    importPost(hp, "login=1&redir=1") 
    addPost(hp, "username", user) 
    addPost(hp, "password", pass) 
    GetPage() 
    if isHeaderContain(hp, "user=") ~= nil then 
     SetFileLink(cookie, GetAllCookie(hp)) 
     return 1 
    else 
     return 0 
    end 
end 
////c code 
int FileSharingService::GetPage(lua_State *ls) 
{ 
    return lua_yield(ls, 0); 
} 

void FileSharingService::AsyncWait(Http_RequestEx *Http, lua_State *LS, boost::asio::deadline_timer* Timer) 
{ 
    if((Http->status_code == Http_RequestEx::ERROR) || (Http->status_code == Http_RequestEx::FISNISHED)) 
    { 
     if(Http->status_code == Http_RequestEx::FISNISHED) 
     { 
      int result = lua_resume(LS, 0); // here I got result == 2 mean error ? 
      if(result == 0)//lua script exit normal, resume success 
      { 
       delete Http; 
       delete Timer; 
      } 
     } 
     else 
      return; 
    } 
    else 
    { 
     Timer->expires_from_now(boost::posix_time::milliseconds(200)); 
     Timer->async_wait(boost::bind(&FileSharingService::AsyncWait, this, Http, LS, Timer)); 
    } 
} 



bool FileSharingService::Login(string URL, string User, string Pass, string &Cookie) 
{ 
    Http_RequestEx *http = new Http_RequestEx; 
    http->url = URL; 
    LuaWarper* Lua = Lua_map[boost::this_thread::get_id()]; //one main luaState per ioservice thread 
    lua_State *thread = lua_newthread(Lua->GetState()); 

    boost::asio::deadline_timer *timer = new boost::asio::deadline_timer(*HClient.ioservice); 

    string functioname = "Login" + GetServicename(URL); 
    if(Lua->isFunctionAvaliable(functioname.c_str()) == false) 
    { 
     throw(FileSharingService::SERVICE_NOT_AVALIABLE); 
    } 
    else 
    { 
     lua_getglobal(thread, functioname.c_str()); 
     lua_pushlightuserdata(thread, http); 
     lua_pushstring(thread, User.c_str()); 
     lua_pushstring(thread, Pass.c_str()); 
     lua_pushlightuserdata(thread, &Cookie); 
     int result = lua_resume(thread, 4); 
     if(result == LUA_YIELD) 
     { 
      HClient.Do(*http, false); 
      AsyncWait(http, thread, timer); 
     } 
     else if(result == 0) 
     { 
      //fisnished at first call 
     } 
     else 
     { 
      //yield error, will handle late 
     } 
    } 
} 

Répondre

1

Désolé never mind cette question, lua_resume retour 2 erreur moyenne mais le travail de script très bien, asio obtenir la page travail bien aussi, et je suivis la ligne qui répondent à fail de lua_resume:

httpinfo.header.append(buffer, (HeaderEndIndex-buffer+2));

si je commente que le travail ligne de lua_resume comme prévu, il retourne 0 signifie la sortie de script, cette ligne ne font pas de chose qui peut affecter l'état de fil de lua juste une chaîne assign, j'ai vérifié il n'y a pas de débordement. si étrange.

+0

Heureux qu'il soit trié. Vous pouvez accepter votre propre réponse pour que les autres sachent que c'est fait. –

Questions connexes