gpt4 book ai didi

c++ - 如何在单独的线程中调用方法并使用返回状态

转载 作者:行者123 更新时间:2023-11-28 05:54:32 24 4
gpt4 key购买 nike

我有一个类有一个方法,它向主机发送一个 POST 请求并附加文件(并在发出请求后删除文件)。这是准系统代码:

using namespace Poco;
using namespace Poco::Net;

FileUploader::FileUploader(std::string aPathToFile): fPathToFile(aPathToFile)
{
}

void FileUploader::uploadFileInSeparateThread()
{
std::thread([&](){
this->uploadFile();
}).detach();
}

bool FileUploader::uploadFile()
{
try {
const Context::Ptr context(new Context(Context::CLIENT_USE, "", "", "~/Desktop/root.pem",Context::VERIFY_ONCE));
Poco::Net::HTTPSClientSession httpsSession(HOST, 443,context);

HTTPRequest request(HTTPRequest::HTTP_POST, "/path/to/service?key=<name_of_file_to_be_uploaded>", HTTPMessage::HTTP_1_1);
request.setContentType("application/x-www-form-urlencoded");
request.setKeepAlive(true);
HTMLForm form;
form.setEncoding(HTMLForm::ENCODING_MULTIPART);
form.addPart("file", new FilePartSource(fPathToFile));
form.prepareSubmit(request);

httpsSession.setKeepAlive(true);
httpsSession.setTimeout(Poco::Timespan(20, 0));
form.write(httpsSession.sendRequest(request));

Poco::Net::HTTPResponse res;
std::istream &is = httpsSession.receiveResponse(res);
Poco::StreamCopier::copyStream(is, std::cout);
qDebug() << "Message: " << is.rdbuf() << endl;
return true;
}
catch (Exception &ex)
{
qDebug() << "Damn: " << ex.displayText().c_str() << endl;
return false;
}
}

如果我这样调用类:

FileUploader uploader(tempfilePath.toStdString());
uploader.uploadFile();

它工作正常,但是,当请求正在进行时,UI 被阻止。所以我决定对其进行多线程处理并创建一个新方法 uploadFileInSeparataeThread。然后我就打电话

FileUploader *uploader = new FileUploader(tempfilePath.toStdString());
uploader->uploadFileInSeparataeThread();

这工作正常,但问题是,uploader 占用的内存永远不会被删除。所以我把它变成了一个唯一的指针:

std::unique_ptr<FileUploader> uploader(new FileUploader(tempfilePath.toStdString()));
uploader->uploadFileInSeparataeThread();

这行不通,我得到一个该死的,文件不存在错误,当我试图在 form.addPart("file", new FilePartSource(fPathToFile)); 部分缺失。这可能是预期的,唯一指针将在调用方法结束时超出范围。所以我尝试了这个:

FileUploader uploader(tempfilePath.toStdString());
std::thread thread([&] (FileUploader * newUploader) { newUploader->uploadFile(); }, &uploader);
thread.join();

现在这可行了,但它不是多线程的,当请求正在进行时,UI 仍然被阻塞。

如何使其正确地多线程化,并在成功发出 POST 请求后使用 uploadFile() 的返回值删除正在上传的临时文件?

最佳答案

在最后一次尝试中:为什么在创建线程后立即调用 std::thread::join() ?它使主线程等待直到另一个线程结束。仅在 uploadFile() 方法结束时调用 join()(在代码的其他地方,您可以在其中检查异步调用的函数的结果),否则它将等待。

例如,您可以通过在退出时设置一些变量或发出一些信号来了解它是否退出,只是以某种方式通知 UI 它已经结束并且可以加入线程而无需强制等待。

关于c++ - 如何在单独的线程中调用方法并使用返回状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34484077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com