// callback function f is responsible for deleting HttpRsp void HttpGetAsync(const WCHAR *url, const std::function<void(HttpRsp *)> &f) { RunAsync([=] { auto rsp = new HttpRsp; rsp->url = str::Dup(url); HttpGet(url, rsp); f(rsp); }); }
int CGit::Run(CGitCall* pcall) { PROCESS_INFORMATION pi; HANDLE hRead; if(RunAsync(pcall->GetCmd(),&pi,&hRead)) return GIT_ERROR_CREATE_PROCESS; DWORD readnumber; BYTE data[CALL_OUTPUT_READ_CHUNK_SIZE]; bool bAborted=false; while(ReadFile(hRead,data,CALL_OUTPUT_READ_CHUNK_SIZE,&readnumber,NULL)) { //Todo: when OnOutputData() returns 'true', abort git-command. Send CTRL-C signal? if(!bAborted)//For now, flush output when command aborted. if(pcall->OnOutputData(data,readnumber)) bAborted=true; } if(!bAborted) pcall->OnEnd(); CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess, INFINITE); DWORD exitcode =0; if(!GetExitCodeProcess(pi.hProcess,&exitcode)) { return GIT_ERROR_GET_EXIT_CODE; } CloseHandle(pi.hProcess); CloseHandle(hRead); return exitcode; }
// // Run a task on the UI thread with a specified priority // template<class T> static void RunOnUIThread(Windows::UI::Core::CoreDispatcherPriority priority, T handler) { auto dispatcher = Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow->Dispatcher; dispatcher->RunAsync(priority, ref new Windows::UI::Core::DispatchedHandler(handler)); }