2012-02-24 1 views
2

나는 최상위 레벨 창이 main_window이고 버튼이 Update 인 GTK 어플리케이션을 가지고있다. Update을 클릭하면 콜백이 실행됩니다. 콜백 내에서 main_window를 숨기고 새로운 스레드를 시작하여 정말 긴 처리를하고 싶습니다. 문제는 gtk_widget_hide()를 사용할 때 "main_window"가 매핑이 해제되고 (콜백이 실행 됨) 콜백이 실행을 중지한다는 것입니다.콜백을 실행하는 동안 최상위 GTK 윈도우를 숨기는 방법

void update_button_clicked (GtkButton* update, 
      GtkWidget* main_window) 
{ 
    int retval = 2; 
    gtk_widget_hide (main_window); // Hide the main window 
    thread m_thread (bind (&update_thread, &retval)); 
    int status = retval; 
    while (status != 0 && status != 1) { 
     gtk_main_iteration(); 
     boost::mutex::scoped_lock lock (mut); 
     { 
      status = retval; 
     } 
    } 
    if (status) // Thread succeeded 
    { 
     show_succeeded_dialog(); 
     gtk_main_quit(); 
    } else { // Thread failed 
     show_failed_dialog(); 
     // Do error handling 
    } 
} 

내 스레드 : 숨겨진

void update_thread (int *retval) 
{ 
    int status = do_long_work(); 
    boost::mutex::scoped_lock lock (mut); 
    { 
     *retval = status; 
    } 
} 

main_window되면, 내 콜백에서 while 루프가 실행을 중지하고 응용 프로그램이 중단 여기 내 콜백입니다. 그러나 gtk_widget_hide (main_window);에 전화를 걸면 모든 것이 예상대로 작동합니다. 스레드 처리가 완료하는 데 오랜 시간이 걸리므로이 창을 숨기고 싶습니다. GTK로이 작업을 수행 할 수있는 방법이 있습니까? 그래도 여전히 콜백을 계속 실행하고 있습니까?

답변

0

창을 숨기려면 정말로 필요합니까? 나는 다음을 할 것이다 : 첫째로, 나는 gtk_set_sensitive()을 호출하여 창을 비활성화 할 것이다.

두 번째로, 나는 두 개의 셀로 VBox을 생성 할 것입니다. 첫 번째 셀에는 지금 가지고있는 모든 위젯을 넣을 수 있습니다. 두 번째 예제에서는 레이블이있는 패널 만 넣습니다. 패널이 숨겨집니다 (이렇게하면 방금 위젯이 표시됩니다).

gtk_set_sensitive()를 호출 한 후 위젯을 사용하여 패널을 숨기고 레이블이있는 패널에 "처리 중 ..."과 같은 내용을 표시합니다.

아마도 설명하는 것보다하기가 쉽습니다. 이것이 도움이되기를 바랍니다.

+1

답장을 보내 주셔서 감사합니다. 메인 윈도우가 화면에 많은 공간을 차지하고 스레드가 처리하는 동안 숨겨진 것이 더 좋을 것이라고 생각했습니다. "처리 중"레이블 사용에 대한 귀하의 제안에 감사드립니다. 진행률 표시 줄이있는 대화 상자가 있다고 생각했지만 백그라운드에서 숫자가 너무 많아서 사용자에게 알림 만 보내면 모든 것을 숨기고 싶다는 이유만으로 미적 감각이 좋을 것이라고 생각했습니다. 그러나 가능한지 확실하지 않으므로 결국 진행률 표시 줄 경로를 따라 가야 할 수도 있습니다. – Tim

0

창이 숨겨져있을 때 콜백이 실행을 중지하는 것은 사실이 아닙니다. 틀린 다른 것이 있어야합니다. GTK로 스레드를 사용하는 것에 관한 모든 requisite information을 읽었습니까?