2012-02-23 6 views
0

libcurlを使用してCに小さなダウンロードマネージャを作成していて、面白い問題が発生しました。私は、このメインループを発見したら、それは私がきちんと今までどのようにcurl_multi_perform作品を理解していなかったと思われ、実際には毎秒ハンドルあたり16 KiBのダウンロード:ステータスを表示して1つのメインループでダウンロードを実行する

while (1) { 
    int cmp_rem; 
    j_recount_speeds(); 
    j_handle_completed(); 
    j_handle_waiting(); 
    curl_multi_perform(j_curlm, &cmp_rem); 
    j_status(); 
    sleep(1); 
} 

を私はマルチインターフェースを含むいくつかのexamples on cURL's websiteを見ていたし、物事を行う正しい方法はソケットファイル記述子のselectへ、curl_multi_performを一度呼び出すことであることを発見しました。

でも、私は、一定の時間間隔でj_recount_speedsj_handle_completedj_handle_waitingj_statusを実行できるようにしたいです。 1つのメインループでcurl_multi_performで何をする必要があるのでしょうか?別のスレッドを使用する必要がありますか?

答えて

1

個別のスレッドは必要ありません。利用可能なインターフェイスを理解するだけで済みます。まず、あなたはタイムアウト付き)(選択を発行することができます

while (continue_condition_true) { 
    struct timeval tv = { 1, 0 }; /* 1 second, zero microseconds */ 

    /* Select returns 0 if it has timed out */ 
    if (select(nfds, readfds, writefds, exceptfds, &tv) == 0) { 
     /* perform timeout operations here */ 
     continue; 
    } 
} 

これが本当のエラーチェック)(選択からの戻り値にする必要があることに注意してください。このコードは、エデュテインメント用です!

第二に、あなたは、経過時間をチェックするためにgettimeofday()を使用することができます。

struct timeval base_tv, tmp_tv; 

gettimeofday(&base_tv, NULL); 

/* do your processing here */ 

gettimeofday(&tmp_tv, NULL); 

if (tmp_tv.tv_sec - base_tv.tv_sec > 0) { 
    /* perform timeout operations here */ 

    /* update base_tv to new 'base' time */ 
    gettimeofday(&base_tv, NULL); 
} 

これは、もちろん、唯一のコースタイムアウト(とは比較にマイクロ秒を無視します)が、更新のためにユーザのためのcURLの表示は、それ以上のものでなければなりません。

EDIT:CURLM構造体からfdset情報を抽出

は以下のようなものを行くために、ドキュメントによると、表示されます:

fd_set readfds, writefds, exceptfds; 
struct timeout tv = { 1, 0 }; /* 1-second timeout */ 
int nfds; 

/* extract fd_set data from CURLM data */ 
curl_multi_fdset(curlm, &readfds, &writefds, &exceptfds, &nfds); 
select(nfds, &readfds, &writefds, &exceptfds, &tv); 

ここでも、唯一のエデュテインメントのために、実際のエラー処理コードはで行く必要ここでは、ナルニアでの保証無効などです。

+0

'curl_multi_perform'の文脈で' select'がどのように動作するのか詳しく説明できますか?私はこの分野ではあまり慣れていないので、どのように動作するのか、どのようにコードを修正するのかは分かりません。 –

+0

http://curl.haxx.se/libcurl/c/curl_multi_perform.htmlに従って、curl_multi_fdset(http://curl.haxx.se/libcurl/c/curl_multi_fdset.html)を呼び出して、あなたが望むfdsetsを取得します次にselect()に渡します。簡単な例はすぐに上に掲載されます。 – tbert

+0

答えをありがとう。私は今はかなり忙しいですし、私のコードではじめる機会がありませんので、私はあなたの答えを受け入れる前にしばらく時間を取って事前にお詫びします。 –

関連する問題