Я создаю C ++ dll и мне нужно сделать один неблокирующий http-запрос. Я имею в виду, что в определенный момент в dll мне нужно начать загрузку файла в фоновом режиме, но возобновить программу после того, как начнется одиночная загрузка.
В настоящее время я использую libcurl в качестве http-клиента. Я читал, что мультиинтерфейс (https://curl.haxx.se/libcurl/c/libcurl-multi.html) даст мне неблокирующую функциональность, но все примеры, которые я вижу, предназначены для одновременного выполнения нескольких запросов http и ожидания их завершения до конца sh w / a в то время как l oop например. Могу ли я использовать этот интерфейс для выполнения одного http-запроса и возобновления работы программы во время загрузки? И если так, может ли он вызвать обратный вызов после завершения? Или я должен постоянно проверять дескриптор, чтобы видеть, завершена ли загрузка?
Пример одного запроса с мультиинтерфейсом libcurl:
int main() {
curl_global_init(CURL_GLOBAL_DEFAULT);
// init easy curl session
auto curl_easy = curl_easy_init();
// set url
auto url = "https://[foo].exe";
curl_easy_setopt(curl_easy, CURLOPT_URL, url);
// set curl to write file to directory
auto path = "C:\\foo\\app.exe";
auto filePtr = std::fopen(path, "wb");
curl_easy_setopt(curl_easy, CURLOPT_WRITEFUNCTION, writeFile);
curl_easy_setopt(curl_easy, CURLOPT_WRITEDATA, filePtr);
// init multi curl session
auto multi_handle = curl_multi_init();
// add easy handle to multi handle
curl_multi_add_handle(multi_handle, curl_easy);
auto res = curl_multi_perform(multi_handle, &running);
auto running = 0;
while (running) {
res = curl_multi_perform(multi_handle, &running);
}
Я бы не хотел, чтобы while (running)
l oop и go выполняли другие действия в main, пока загрузка файлов. Я могу неправильно понять «неблокирующую» природу curl_multi_perform (). Разве это неблокирование только в том смысле, что много запросов могут происходить одновременно? Если так, я не думаю, что использование этого для создания одного запроса даст мне то, чего не было бы с curl_easy_perform. Извинения, если это выходит за пределы переполнения стека, я не хочу учебник по libcurl. Но я должен вместо этого использовать что-то вроде блокирующего вызова libcurl (curl_easy_perform) внутри std :: asyn c ()?