2013-07-03 3 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

이것은 매우 간단합니다. 먼저 할 것입니다 기능을 만들

제 (그래픽 스레드에서) 그림 :

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

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

, 동안 설정, 드로우 기능으로 위젯의 draw 이벤트를 연결

마지막으로 호출 할 수있는 다른 스레드에서 다시 그리기 위젯을 강제로 :

gtk_widget_queue_draw(some_widget);