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;
}

Hyun의 이미지

위 분과 같은 문제를 겪고 있습니다.
다른 thread에서 gtk의 button이나 progress bar를 갱신시켜 주려고 하는데 잘 안되는군요.
위 분처럼 다른 thread에서 gtk_... 관련 함수를 호출했습니다. 결과 어플리케이션이 잘 그려지지 않는 것 같습니다.

갱신하려고 하는쪽에 사용자 signal을 만들어서 signal을 보내 gtm_main함수가 button과 progress bar를 업데이트 하게 해야하나요?
그렇다면 관련 프로그램 소스나 관련 문서같은 참고할 만한게 있으면 소개시켜주시면 감사하겠습니다...

#include <gtk/gtk.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>

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;
}
Hyun의 이미지

http://developer.gnome.org/doc/API/2.0/gdk/gdk-Threads.html
요기에 보면 가운데쯤 Erik Mouw 아저씨가 좋은 예제를 만들어 두셨군요... ;)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.