2009-08-07 17 views
0

パイプを使用して発生したメインgtkスレッド(別のスレッドから)に通知しようとしています。私はパイプをセットアップしようとしているときに次の警告を受け取ります。良い回避策とは何ですか?パイプ(ハンドラ)を2003年のfdに変換中にエラーが発生しました

私はこのg_io_channel_win32_new_fdが、私はこの警告を見ることができるので、パイプは全て:(

のGLib-WARNING **で作成されていない場合:giowin32.c:1564:3は、Cライブラリではありませんファイルディスクリプタ

int fds[2]; 
    GIOChannel* gioChannels[2]; 
    HANDLE rdPipe, wrPipe; 
    SECURITY_ATTRIBUTES saAttr; 

    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
    saAttr.bInheritHandle = TRUE; 
    saAttr.lpSecurityDescriptor = NULL; 
    if (CreatePipe(&rdPipe, &wrPipe, NULL, 1024)) 
    { 
     fds[0] =_open_osfhandle((gssize)rdPipe, O_RDONLY); 
     fds[1] = _open_osfhandle((long)wrPipe,_O_APPEND); 

     gioChannels[0] =g_io_channel_win32_new_fd(fds[0]); 
     gioChannels[1] =g_io_channel_win32_new_fd(fds[0]); 

     g_io_add_watch(gioChannels[1],(GIOCondition) (G_IO_IN | G_IO_HUP), 
         (GIOFunc)SomeCallaback,(gpointer)this); 

    } 

目標は何かがスレッドのスレッドで発生した主なアプリケーションに通知することです。私の場合、私は(生成されたものからメインスレッドの関数を呼び出す)マルチスレッドの方法でGTKを使用することはできません、パイプでやろうとしています。

私はまたこれが視覚的なスタジオの問題かもしれないことを見たthread

何か提案がありますか?

答えて

1

エラーと同様に、CreatePipeによって作成されたハンドルはファイル記述子ではありません。 Windowsプログラミングモデルはファイル記述子を使用しないため、WindowsとWindows以外のI/O関数を通常は混在させることはできません。あなたのコードでいくつかのキャストを削除した場合、あなたのコンパイラは問題を特定するだろうと思う - Cスタイルの(または再解釈する)C++コードのcasrs は、

+0

ありがとう、私は理解しています - あなたは回避策として何をお勧めしますか? – vehomzzz

関連する問題