1

GTK+ でいくつかのことを管理するためにスレッドを使用しようとしていますが、新しいスレッドで GUI 関数を使用しようとするとすぐに GUI がロックされ、GTK+ はスレッドセーフではないため、これは理にかなっています。とにかくこのあたりはありますか?

これが私のコードです:

int main(int argc, char *argv[])
{   

 GError *error = NULL;

/* init threads */  
g_thread_init(NULL);
gdk_threads_init();

/* init gtk */
gtk_init(&argc, &argv);

....

//Multithreaded functions
g_thread_create(argument_thread, (gpointer)label7, FALSE, &error );

gdk_threads_enter();
gtk_main();
gdk_threads_leave();
return 0;
}

void *argument_thread(void *args)
{
    while(1)
    {
    gdk_threads_enter();
    gtk_entry_set_text(entry2,"random stuff");
    gdk_threads_leave();

    }
}
4

2 に答える 2

3

これが問題になるかどうかはわかりませんが (GTK を知りません)、gtk_main が開始する前にスレッドがロックを取得すると、競合状態が発生する可能性があります。

次に、試すことができます:

gdk_threads_enter();

//Multithreaded functions
g_thread_create(argument_thread, (gpointer)label7, FALSE, &error );

gtk_main();
gdk_threads_leave();

さらに、ループを一時的に処理する必要があります。

void *argument_thread(void *args)
{
    while(1)
    {
        gdk_threads_enter();
        gtk_entry_set_text(entry2,"random stuff");
        gdk_threads_leave();

        sleep(10);
    }
}
于 2013-06-11T18:07:32.377 に答える
-1

g_timeout e gthread を使用して問題を解決しました: http://www.freemedialab.org/wiki/doku.php?id=programmazione:gtk:gtk_e_i_thread

基本的に、スレッドを起動する関数、ウィジェット (スレッド) を操作せずにジョブを実行する関数、およびスレッドによって書き込まれた特定の値を n 秒ごとにチェックするタイムアウト タイマーとして機能する 3 番目の関数を使用し、「グラフィックインターフェース。

または、「g_idle_add」を使用できます: http://www.freemedialab.org/wiki/doku.php?id=programmazione:gtk:gtk_e_i_thread#versione_con_g_idle_add

gdk_threads_enter() と gdk_threads_leave() は、Gtk の 3.6 バージョンから非推奨になりました。

于 2017-03-05T08:53:21.367 に答える