gtk와 thread 질문염..

스탑와치처럼 시간이 초단위로 증가하는걸 보여주기 위해서.....fork를
시도했지만....좀비때문에 포기했구여...ㅡ.ㅡ
이번엔 thread를 사용을 해보았는데...
이상해게 gtk_label_set_text()가 안먹더군요...(물론 내 잘못이겠져...)
아직 쓰레드나 fork는 많이 사용안해본 관계로...잘 몰라서 질문드립니다..
아래 코드를 간단히 적어놓았는데...
창이 생성과 동시에 쓰레드가 생성돼고 쓰레드는 계속 1초씩 sleep을
하면서 그때마다 function이나 아니면 바로 윈도에
라벨에 gtk_label_set_text를 하는데...안먹네여...ㅡ.ㅡ
즉, 라벨을 계속 set_text하구 싶은데 안되는것좀
왜 그러는지..알려주세영
허접한 쏘스좀 보시구 한수 가르쳐 주세용..^^;
즐 삽~!
#include
#include
#include
#include
#include
#include
static GtkWidget *window;
static GtkWidget *minute_label, *second_label;
static int minute = 0;
static int second = 0;
static gchar s[100], m[100];
int res;
pthread_t a_thread;
void *thread_result;
/*
void update_second(gchar* s)
{
g_print("오냐 쓰바??????? %s\n", s);
gtk_label_set_text(GTK_LABEL(labelTime.second_label), s);
//gtk_widget_show(labelTime.window);
}
*/
void *thread_function(void *arg)
{
recur
second = second + 1;
sprintf(s, "%d", second);
if(second > 5){
minute = minute + 1;
sprintf(m, "%d", minute);
gtk_label_set_text(GTK_LABEL(minute_label), m);
second = 0;
gtk_label_set_text(GTK_LABEL(second_label), "0");
}
else{
g_print("second %s\n", s);
//update_second(s);
gtk_label_set_text(GTK_LABEL(second_label), s);
}
sleep(1);
goto recur;
}
void ftp_cancel()
{
g_print("quit\n");
}
int main(int argc, char *argv[])
{
// GtkWidget * window;
GtkWidget *label, *label2;
GtkWidget *table;
GtkWidget *button_hide, *button_cancel;
char *buf;
gtk_set_locale();
gtk_init(&argc, &argv);
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_widget_set_usize(GTK_WIDGET(window), 230, 150);
gtk_window_set_title (GTK_WINDOW(window), "test");
gtk_container_set_border_width (GTK_CONTAINER(window), 10);
gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
table = gtk_table_new (4, 4, TRUE);
gtk_container_add (GTK_CONTAINER (window), table);
minute_label = gtk_label_new("0");
gtk_table_attach_defaults (GTK_TABLE(table), minute_label, 0, 1, 2, 3);
gtk_widget_show(minute_label);
label = gtk_label_new("분");
gtk_table_attach_defaults (GTK_TABLE(table), label, 1, 2, 2, 3);
gtk_widget_show(label);
second_label = gtk_label_new("0");
gtk_table_attach_defaults (GTK_TABLE(table), second_label, 2, 3, 2, 3);
gtk_widget_show(second_label);
label2 = gtk_label_new("초");
gtk_table_attach_defaults (GTK_TABLE(table), label2, 3, 4, 2, 3);
gtk_widget_show(label2);
button_hide = gtk_button_new_with_label ("시간아~올라와");
//gtk_signal_connect_object(GTK_OBJECT (button_hide), "clicked", (GtkSignalFunc) hide_ftp, 0);
gtk_table_attach_defaults(GTK_TABLE(table), button_hide, 0, 2, 3, 4);
gtk_widget_show(button_hide);
button_cancel = gtk_button_new_with_label ("꺼져보료");
/*(cancel process*/
gtk_signal_connect_object(GTK_OBJECT (button_cancel), "clicked", (GtkSignalFunc)ftp_cancel, 0);
gtk_table_attach_defaults(GTK_TABLE(table), button_cancel, 2, 4, 3, 4);
gtk_widget_show(button_cancel);
//process create//
res = pthread_create(&a_thread, NULL, thread_function, NULL);
if(res != 0){
perror("아 쓰바....쓰레드 생성 실패다...");
exit(EXIT_FAILURE);
}
gtk_widget_show(table);
gtk_widget_show(window);
gtk_main();
/*-- Return 0 if exit is successful --*/
return 0;
}
위 분과 같은 문제를 겪고 있습니다.다른 thread에서 gtk의 b
위 분과 같은 문제를 겪고 있습니다.
다른 thread에서 gtk의 button이나 progress bar를 갱신시켜 주려고 하는데 잘 안되는군요.
위 분처럼 다른 thread에서 gtk_... 관련 함수를 호출했습니다. 결과 어플리케이션이 잘 그려지지 않는 것 같습니다.
갱신하려고 하는쪽에 사용자 signal을 만들어서 signal을 보내 gtm_main함수가 button과 progress bar를 업데이트 하게 해야하나요?
그렇다면 관련 프로그램 소스나 관련 문서같은 참고할 만한게 있으면 소개시켜주시면 감사하겠습니다...
자답이군요...
http://developer.gnome.org/doc/API/2.0/gdk/gdk-Threads.html
요기에 보면 가운데쯤 Erik Mouw 아저씨가 좋은 예제를 만들어 두셨군요... ;)
댓글 달기