0

メインの gtk スレッド (別のスレッドから) に通知を使用しようとしていますが、パイプを使用して発生したものもあります。パイプをセットアップしようとすると、次の警告が表示されます。良い回避策は何ですか?

この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 を使用できない (生成されたスレッドからメインスレッドの関数を呼び出す) ため、パイプ経由で実行しようとしています。

また、このスレッドでビジュアルスタジオの問題である可能性があることもわかりました

助言がありますか?

4

1 に答える 1

1

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

于 2009-08-07T14:08:25.203 に答える