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