C ++でlibcurlを使用しており、 Boost.Threadcurl_easy_perform
を使用してUIとは別のスレッドで呼び出しています。
メインUIには、完全に応答したいキャンセルボタンがあります(つまり、ユーザーがクリックすると、すぐに反応するはずです)。(このshould_cancel
質問のように)アトミック変数を読み取るように設定された読み取り、書き込み、および進行状況のコールバックがありますが、2つの問題があります。
多くの場合、キャンセルが押されてからカール操作が完了するまで、非常に小さな(ただし目立つ)遅延があります。
時折、非常に長い(時には途方もない)遅延があります。この場合、次のいずれかです。
a。進行状況、読み取り、および書き込みのコールバックは、単に長い間呼び出されないか、または
b。progressコールバックが呼び出され、ゼロ以外の値が返されます(つまり、終了する必要があります)が、curl操作がしばらく完了しません(実際、progress関数がその間に再度呼び出されます!)
それで:
- なぜ長い遅延が発生するのですか(特にprogress関数を呼び出さずに)?
- キャンセルボタンが正しく反応するようにするには、代わりに何をすればよいですか?
1つの可能性は、キャンセル操作が成功したことをUIに通知することですが、キャンセルされるまでバックグラウンドでカールスレッドを実行し続けます。これに伴う問題(私は思う)はshould_cancel
、操作が開始されたダイアログボックスにスコープされるのではなく、変数が強制的にグローバルになることです。