2013-07-03 58 views
1

我有一個程序(用C語言編寫,目前運行在Mac OS X 10.8.4上)模擬世界並每秒更新世界狀態多次。GTK + 3多線程

在啓動時,該程序創建一個後臺線程,創建一個簡單的GTK窗口並調用gtk_main

在每次更新世界狀態(在主線程中)之後,我希望窗口反映出這種變化。我的第一個方法是在更新世界之後簡單地更新GTK小部件,但因爲這是一個不同的線程,所以事情非常混亂。

是否有某種機制,主線程可以更新圖形線程上的某些狀態,然後排隊提示圖形線程重繪的事件?即

void draw() { 
    // This can only be called from the graphics thread. 
    gtk_label_set(GTK_LABEL(label1), "some state"); 
} 

// This causes draw() to be called on the graphics thread. 
gtk_please_redraw_this_thing_on_the_graphics_thread(); 

有沒有辦法做到這一點?或者任何涵蓋它的教程?

+0

鈣不是使用[GCD](http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html):'dispatch_async(dispatch_get_main_queue(),...) '? –

+0

我試圖使它儘可能便攜,所以不希望依賴於Mac OS X功能。 – DanielGibbs

回答

1

原來這很簡單。

首先創建一個會做功能繪圖(在圖形線程):

gboolean draw_function(GtkWidget *w, GdkEventExpose *event) { 
    // Draw things. 
    return TRUE; 
} 

然後,在成立,draw事件窗口小部件的連接到您的繪製函數:

g_signal_connect(G_OBJECT(some_widget), "draw", G_CALLBACK(draw_function), NULL); 

最後,迫使小部件從另一個線程重繪您可以撥打:

gtk_widget_queue_draw(some_widget);