1

可変量の行を持つ配列よりも配列を保持できるキューを作成するにはどうすればよいでしょうか。

char data[n][2][50];
//Could be any non 0 n e.g:
n=1; data = {{"status","ok}};
// or
n=3; {{"lat", "180.00"},{"long","90.123"},{"status","ok}};
// and so on

キューに追加される n。それとも、私が求めているものよりも優れた解決策がありますか? キューは、単一のデータ項目を記述する (または再利用可能な例を見つける) のに十分簡単ですが、上記にどの方法を使用するかはわかりません。多分構造体?それは配列とnについては解決しますが、変数配列については解決しますか?

より広く、私が解決しようとしている問題はこれです。POST を使用して Web サーバーと通信する必要があります。このコードは既に作成されていますが、このタスクを実行する必要があるたびにメインスレッドをビジー状態に保ちたくありません。特に、接続が確立されているかどうかなどの他のチェックを行う必要があるためです。戻って待つか、オンラインに戻してみてください。

私の考えは、このタスク専用の 1 つの別のサーバーを用意することでした。メインスレッドが子スレッドに何をすべきかを知らせるには、キューを作成するのが最善の方法であると考えました。

データは可変数の文字列ペアになります。お気に入り:

主要

//Currently does
  char data[MAX_MESSAGES_PER_POST][2][50];
  ...
  assembles array
  sendFunction(ptrToArray, n);
  resumes execution with large and un predicatable delay

//Hopefully will do
  ...
  queue(what needs doing)
  carry on executing with (almost) no delay

while(0)
{
  if(allOtherConditionsMet())  //Device online and so forth
  {
    if(!empty(myQueue))
    {
       //Do work and deque
   }
 }
 else
 {
     //Try and make condition ok. Like reconect dongle.
 }
  // sleep/Back off for a while
}
4

1 に答える 1

3

Glib などの既存のライブラリを使用できます。GLib はクロスプラットフォームです。GLib の非同期キューを使用した場合は、次のようにします。

キューを作成する最初のスレッドが実行されます。

GAsyncQueue *q = g_async_queue_new ();

他のスレッドは、次のように参照できます (キューを使用する意図を示します)。

g_async_queue_ref (q);

この後、どのスレッドも次のようにアイテムをキューに「プッシュ」できます。

struct queue_item i;
g_async_queue_push (q, ( (gpointer) (&i)));

また、どのスレッドでも、次の方法でキューからアイテムを「ポップ」できます。

struct queue_item *d = g_async_queue_pop (q);
/* Blocks until item is available.  */

スレッドがキューの使用を終了し、それを気にしなくなると、次のように呼び出します。

g_async_queue_unref (q);

キューを作成したスレッドでさえ、これを行う必要があります。

他にも便利な関数がたくさんあります。これらについては、ドキュメントのページですべて読むことができます。同期 (操作のロック/一貫性/原子性) は、ライブラリ自体によって処理されます。

于 2012-08-20T09:14:21.580 に答える