URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8725
[ Назад ]

Исходное сообщение
"Создание списка в gtk"

Отправлено ZLv , 10-Май-10 18:33 
Не знаю как сделать список для программы просмотра игровых серверов.
Следующий вариант его реализации подсмотрел в программе xqf (http://www.linuxgames.com/xqf/index.shtml). Но список должен обновляться через некоторые промежутки времени, а в данной реализации происходят разные ошибки выполнения.

#include <iostream>
#include <gtk/gtk.h>
char titles[][30+1] = {"First","Second"};
GtkWidget* store;
pthread_mutex_t* mutex;
void m(int);
void* tick_temp(void*);
int main(int argc, char** argv)
{    
    gtk_init(&argc, &argv);
    GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size ( GTK_WINDOW(window), 600, 400);
    int sz=2;
    store = gtk_clist_new (sz);
    GTK_CLIST_SET_FLAG (GTK_CLIST (store), CLIST_SHOW_TITLES);
    GtkWidget* label,*alignment;
    for (int i=0; i<sz; i++)
    {
        alignment = gtk_alignment_new (0.0, 0.5, 0.0, 0.0);

        label = gtk_label_new (titles[i]);
        gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
        gtk_container_add (GTK_CONTAINER (alignment), label);
        gtk_widget_show (label);

        gtk_clist_set_column_widget (GTK_CLIST (store), i, alignment);
        gtk_clist_set_column_width(GTK_CLIST (store), i, 151);
        gtk_widget_show (alignment);
    }
    GtkWidget* container = gtk_vbox_new(0,0);
    gtk_box_pack_end(GTK_BOX(container), store, 0, 0, 0);
    label = gtk_label_new ("UGABUGAGA!!!");
    gtk_box_pack_start(GTK_BOX(container), label, 0, 0, 0);
    gtk_container_add(GTK_CONTAINER(window), container);
    gtk_widget_show_all(window);
    
    struct sigaction act;
    act.sa_handler = m;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    
    sigaction(SIGUSR1,&act,NULL);
    pthread_t thread;
    
    mutex = new pthread_mutex_t();
    
    pthread_mutex_init(mutex, NULL);
    pthread_mutex_lock(mutex);
    int res = pthread_create(&thread, NULL, tick_temp, NULL);
    pthread_mutex_unlock(mutex);
    gtk_main();
    
    delete mutex;
    
    return 0;
}
void* tick_temp(void*)
{
    int notfirst=0;
    while (1)
    {
        pthread_mutex_lock(mutex);
        if(!notfirst++) sleep(0.3);
        kill(getpid(),SIGUSR1);
        pthread_mutex_unlock(mutex);
        sleep(1);
    }
}
void m(int)
{
    pthread_mutex_lock(mutex);
    int sz=2;
    char** text;
    text = new char*[sz];
    static int count = 0;
    
    gtk_clist_clear (GTK_CLIST (store));
    int sts = 8;
    for (int i=0; i<sts; i++)
    {
        count++;
        text[0] = new char[50]; text[1] = new char[50];
        sprintf(text[0],"What tf!?",count);
        sprintf(text[1],"%d",count);
    
        gtk_clist_insert(GTK_CLIST (store),i,text);
    }
    pthread_mutex_unlock(mutex);
}


Содержание

Сообщения в этом обсуждении
"Создание списка в gtk"
Отправлено arturpub , 11-Май-10 14:41 
если суть только в обновлении данных CList'а, лично я бы не стал мутить с тредами вперемешку с сигналом, а сделал бы через g_timeout_add() или вроде того. если хочется тредов, надо выяснить, кто именно ловит сигнал и хоть одним глазком глянуть на разные ошибки исполнения 8)

http://library.gnome.org/devel/glib/stable/glib-The-Main-Eve...


"Создание списка в gtk"
Отправлено ZLv , 12-Май-10 15:43 
>если суть только в обновлении данных CList'а, лично я бы не стал
>мутить с тредами вперемешку с сигналом, а сделал бы через g_timeout_add()
>или вроде того. если хочется тредов, надо выяснить, кто именно ловит
>сигнал и хоть одним глазком глянуть на разные ошибки исполнения 8)
>
>
>http://library.gnome.org/devel/glib/stable/glib-The-Main-Eve...

Мне немного уже подсказали:
http://library.gnome.org/devel/gtk-faq/stable/x481.html
http://library.gnome.org/devel/gdk/unstable/gdk-Threads.html
http://library.gnome.org/devel/gtk/stable/GtkTreeView.html
А ошибки были разнообразные, я все даже не посмотрел :)