[질문] gtk 를 이용하여 외부 타스크에서 gtk_main쪽에 시그널

똘마니의 이미지

안녕하세요 gtk 초보 프로그래머 입니다.

gtk 를 이용하여 외부 타스크에서 gtk_main쪽에 시그널 전송법 좀..

알려주세요. 우선은 특수한 목적에 의하여 gtk에서 X를 띄우지 않는 상황에서

직접 프레임 버퍼에 gui 를 그려주는 프로그램을 구현 중인데요

리눅스에서 멀티 쓰레드 개념을 이용하여 작업을 하고 있는데 gtk_main()만을

담당하는 쓰레드를 하나 두어 이 쓰레드는 gtk_main에서 내부에서 gtk 자체

를 수행하는 역할을 하구요

또하나의 쓰레드는 이 gtk_main을 Controll하기 위한 런쳐 쓰레드를 두어

실질적으로 이 쓰레드가 시그널 등록을 한 핸들러를 수행하기 위해

첫번째 쓰레드(gtk_main)쓰레드에게 시그널을 전송을 합니다.

우선, 테스트를 위하여 Tree Widget을 이용하여 구현하고 있는데

이상하게도 시그널을 전송하면 gtk_main을 감싸고 있는 쓰레드가 수신을 하여

정상적으로 해당 시그널 핸들러에서 정확히 수신을 하는데

문제는, gui에 변경이 없다는 것입니다.

즉, 런쳐 쓰레드가 TreeItem 관련된 서브 트리 확장(expand) 시그널을

전송하면, gtk_main을 수행하는 쓰레드에서 시그널 수시만 할뿐 실제로

Tree 위젯의 서브 트리가 확장이 되지는 않습니다.

아래는 간단한 슈도 코드를 알려 드립니다.

=========

// 런쳐 쓰레드

//글로벌로 GtkWidget들을 선언하여 두개의 쓰레드가
// Widget의 메모리 영역을 공유..
// GtkWidget *gtkTree; ...

int main()
{
gtk_init()

gtk_signal 등록...

gtk_widget들 윈도우에 배열...

while(1)
{
//시그널 송신
g_signal_emit_by_name(GTK_TREE_ITEM(tree_item), "expand");

}
}

// gtk_main을 수행하는 쓰레드

// GtkTree 위젯 확장..시그널 핸들러 함수
sig_handler(GtkWidget * item, gchar *signame)
{
g_print("signal received...\n");
}

int gtk_signal_worker_proc()
{
while(1)
{
gtk_main();
}
}

=======

이런식으로 간단히 했는데 아까도 말씀드렸듯이 signal received
는 출력이 됩니다.(정상적으로)

혹시, 시그널이 아닌 이벤트 방식(?)을 사용해야 되는건지..
또, 그 두개의 차이점은 무엇인지 궁금하세요..
도데체 왜 안될까요?

그리고, 한가지 더 궁금한것은 윈도우에 버튼을 하나 달아서

버튼의 "clicked" 핸들러에서 gtk_main_quit(); 를 호출하였는데

이것도 역시 시그널 전송시 수신은 되는데 gtk_main_quit를 호출하여도

gtk_main()함수에서 빠져 나오지 못하네요..

그래서, 부모 쓰레드를 먼저 죽이면 "main_loop != NULL" 이라는

메세지가 뜨네요.. 혹시, 이 두가지 방법에 대한 해결책을

아시는 분은 알려 주시기 바랍니다.

질문 내용이 넘 길어서 죄송합니다. 그럼, 즐거운 하루 되십시오..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.