【发布时间】:2011-05-26 06:22:06
【问题描述】:
我在 C++ 中使用 libcurl,并且我使用 Boost.Thread 在与我的 UI 不同的线程中调用 curl_easy_perform。
主 UI 有一个取消按钮,我希望它能够完美响应(即,当用户点击它时,它应该立即做出反应)。我已经设置了读取、写入和进度回调来读取原子should_cancel 变量(如this 问题),但有两个问题:
从按下取消到卷曲操作完成之间通常会有一个非常小的(但很明显)延迟。
-
有时会有很长的(有时是无休止的)延迟。在这种情况下,要么:
一个。很长时间没有调用进度、读取和写入回调,或者
b.进度回调 is 被调用,我返回一个非零值(意味着它应该终止),但是 curl 操作没有完成一段时间(实际上,在此期间再次调用了进度函数!)
所以:
- 为什么会出现长时间的延迟(尤其是在没有调用进度函数的情况下)?
- 我应该怎么做才能让取消按钮正确反应?
一种可能性是告诉 UI 取消操作成功,但在后台继续运行 curl 线程直到它取消。这个问题(我认为)是它强制 should_cancel 变量是全局变量,而不是限定在操作开始的对话框中。
【问题讨论】:
-
使用非阻塞 curl_multi_perform 怎么样?curl.haxx.se/libcurl/c/curl_multi_perform.html
标签: c++ multithreading curl boost-thread