LINUX.ORG.RU

Создание списка в gtk


0

0

Не знаю как сделать список для программы просмотра игровых серверов. Следующий вариант его реализации подсмотрел в программе 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 ("UGABUGA!!!");
    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 the fuck!?");
        sprintf(text[1],"%d",count);
    
        gtk_clist_insert(GTK_CLIST (store),i,text);
    }
    pthread_mutex_unlock(mutex);
}



Последнее исправление: ZLv (всего исправлений: 2)

забей на threads и используй g_timeout_add()/g_timeout_add_seconds()

ananas ★★★★★
()

Спасибо всем за помощь.

И ещё... в GtkTreeView не знаю, как сделать, чтобы пользователь мог изменять размеры столбца: в примерах нет.

ZLv
() автор топика

Всё, добавил в пример gtk-потоки, -мьютекс, новый список. Если окошко не трогать, то без вылетов программа работает достаточно долго.

#include <iostream>
#include <gtk/gtk.h>
char titles[][30+1] = {"First","Second"};
GtkWidget* store;
static GMutex* mutex;
GtkTreeModel* create_and_fill_model();
void m(int);
void* tick_temp(void*);
enum
{
	COL_FIRST,
	COL_SECOND,
	NUM_COLS
};
int collist[NUM_COLS] = {COL_FIRST, COL_SECOND};
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_tree_view_new();
	int i=0;
	GtkTreeViewColumn* column;
	GtkCellRenderer *renderer;
	for (;i<sizeof(titles)/sizeof(titles[0]); i++)
	{
		column = gtk_tree_view_column_new();
		gtk_tree_view_column_set_title(column, titles[i]);
		renderer = gtk_cell_renderer_text_new();
		gtk_tree_view_column_pack_start(column, renderer, 1);
		gtk_tree_view_column_add_attribute(column, renderer, "text", collist[i]);
		gtk_tree_view_column_set_resizable(column, 1);
		gtk_tree_view_append_column(GTK_TREE_VIEW(store), column);
	}
	
	GtkTreeModel* model = create_and_fill_model();
	gtk_tree_view_set_model(GTK_TREE_VIEW(store), model);
	
	GtkWidget* container = gtk_vbox_new(0,0);
	gtk_box_pack_end(GTK_BOX(container), store, 0, 0, 0);
	GtkWidget* 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 = g_mutex_new();
	
	g_mutex_lock(mutex);
	
	GError *error = NULL;

	g_thread_init(NULL);
	gdk_threads_init();
	
	if (!g_thread_create(tick_temp, NULL, FALSE, &error))
	{
		g_printerr ("Failed to create YES thread: %s\n", error->message);
		return 1;
	}
	
	gdk_threads_enter();
	g_mutex_unlock(mutex);
	gtk_main();
	gdk_threads_leave();
	
	return 0;
}
void* tick_temp(void*)
{
	int notfirst=0;
	while (1)
	{
		g_mutex_lock(mutex);
		if(!notfirst++) sleep(0.3);
		kill(getpid(),SIGUSR1);
		gdk_flush ();
		g_mutex_unlock(mutex);
		sleep(1);
	}
	return NULL;
}
void m(int)
{
	g_mutex_lock(mutex);
	GtkTreeModel* model = create_and_fill_model();
	gtk_tree_view_set_model(GTK_TREE_VIEW(store), model);
	
	g_mutex_unlock(mutex);
}
GtkTreeModel* create_and_fill_model()
{
	static int count = 0;
	GtkTreeStore *treestore;
	GtkTreeIter toplevel;

	treestore = gtk_tree_store_new(NUM_COLS, G_TYPE_STRING, G_TYPE_INT);

	int sts = 15;

	for (int i=0; i<sts; i++)
	{
		count++;
		
		gtk_tree_store_append(treestore, &toplevel, NULL);
		gtk_tree_store_set(treestore, &toplevel,
			COL_FIRST, "Test",
			COL_SECOND, count,
			-1);
		std::cerr << count;
	}

	return GTK_TREE_MODEL(treestore);
}
Может это мне нужно использовать что-то кроме сигналов? В полной программе, создание которой является конечной целью, g_timeout_add() не катит т.к. поток должен сам сканировать сервер независимо от главного потока.

ZLv
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.