2015-01-02 4 views
1

그래서 기존 C 응용 프로그램에 GUI를 작성하고 있습니다.매 x 초마다 GTK + 함수 호출

GUI는 단지 표시 할뿐 애플리케이션에 실제로 정보를 제공하지 않는 단순한 인터페이스입니다. 그러나 새로운 정보가 있으면 링크 된 목록을 확인해야합니다.

이제는 다른 스레드를 사용하여 수동으로이 기능을 실행하고 싶지 않습니다.

GTK 메인 루프에 타임 기능이나 콜백을 '해킹'하는 방법이 있습니까? 그래서 My 함수는 1 초마다 호출됩니다. 물론 제 함수는 비 블로킹입니다.

나는 c로 씁니다.

+0

새로운 정보의 출처 및 방법은 무엇입니까? –

+0

변경 사항에 대한 링크 된 목록 폴링은 UI 프로그래밍 기술 측면에서 끔찍한 것으로 들립니다. 데이터 모델의 코드를 제어 할 수있는 경우 목록의 항목이 변경되면 알림 콜백을 사용하여 UI를 업데이트하십시오. –

+0

나는 컨트롤을 가지고 있지만 일반적으로 gui에 대한 호출과 함께 원래 코드를 'polute'하고 싶지 않습니다. –

답변

5

GTK에는 glib가 포함됩니다. glib는 gtk와 다른 많은 gobject 라이브러리가 사용하는 핵심 알고리즘 및 데이터 구조 라이브러리입니다. glib는 mainloop에서 호출 할 함수를 제공합니다. glib는 gtk를 포함 할 때 포함됩니다.

GSList* List; //This is a singly linked list provided by glib as well. 
g_timeout_add_seconds(1, YourCallBack, List); 

g_timeout_add하는 첫 번째 인수는 다음과 같습니다

당신은 다른 사람이 함수를 등록 할 가지고 GSourceFunc에 대한 서명이 어딘가에 gboolean (*GSourceFunc) (gpointer user_data);

gboolean YourCallBack(void* data) 
{ 
    GSList list = (GSList*) data; 
    // Check your list 
    return TRUE; // return FALSE to remove the timeout 
} 

하는 콜백으로 GSourceFunc이 필요합니다 두 번째는 GSourceFunc (콜백 함수)에 대한 포인터이고 세 번째 인수는 콜백 함수에 전달할 데이터에 대한 포인터입니다.

편집 GSlist는 목록이 변경 될 수 있기 때문에 일반적으로 포인터는 목록의 노드 중 하나 (첫 번째)에 대한 포인터이며, 노드는 목록에서 앞에 붙거나 제거 될 수 있습니다. 이것은 위험합니다. 이 예제에서는 g_timeout_add_seconds를 사용하는 방법을 보여 주지만 목록에 액세스하려면보다 안전한 방법이 필요하다. 그러나 이것은 g_timeout_add_x 계열의 함수를 사용하는 방법을 보여줍니다.

편집 : g_timeout_add를 사용하여 초보다 작은 간격으로 콜백을 지정할 수 있지만 그러한 정밀도가 필요하지 않은 경우 g_timeout_add_seconds는 더 적은 리소스를 사용합니다.

자세한 내용은 https://developer.gnome.org/glib/2.42/glib-The-Main-Event-Loop.html#g-timeout-add을 참조하십시오.

+0

링크 된 문서에서 언급 된 이유로 풀 초를 사용하는 예제에서'g_timeout_add_seconds()'를 사용하십시오. – jku

+0

@jku 네 말이 맞아, awnser가 좀 나아 졌어. – hetepeperfan

+0

또한 연결된 목록 사용 예제가 손상되었습니다. 질문은 목록이 시간이 지남에 따라 변경됨을 지정합니다. GSList를 사용하면 목록 머리글에 대한 포인터가 변경 될 수 있습니다. 따라서'g_timeout_add_seconds()'에 헤드 포인터 자체를 부여 할 수는 없습니다 (그러나 현재 헤드 포인터를 가리키는 포인터를 줄 수 있습니다). – jku

4

Glib main loopGTK main loop을 읽으십시오. g_timeout_add 및 아마도 g_idle_add 등이 필요합니다.

Gio을 알아야 할 수도 있습니다. 새로운 정보가 응용 프로그램에 어떻게 전달되는지는 추측 할 수 없습니다.

멀티 스레드 응용 프로그램을 사용하는 경우 주 스레드 만 GTK 호출을 수행 할 수 있습니다.

관련 문제