Показать Mysql результат с C в Gtktreeview - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь использовать GtktreeView, чтобы показать результаты запроса MySQL в C со следующим кодом, который вызывается из обработчика изменений gtkentry для получения эффекта «поиск по мере ввода»:

...
    result = mysql_store_result(conn);
if (result)
{
    while ((row = mysql_fetch_row(result)))
    {
    gtk_list_store_append(store, &iter);
    gtk_list_store_set(store, &iter, cID, row[0],
                                     cCity, row[1],
                                     cState, row[2],
                                     cPop, atoi(row[3]),
                                     cLast, "", -1);
   }
}
etc...

Проблема в том, что результат может содержать много данных, до нескольких тысяч строк, и хотя mysql достаточно быстр, этот объем данных делает GtkTreeView неприемлемо медленным (намного медленнее, чем набор текста и часто поражает компьютер). Когда я добавляю LIMIT 20 в запросе, этот код работает нормально, но тогда достижимы только первые 20 строк сопоставленных данных. Я думаю, что это так медленно, потому что все изменения gtktreeview активны. В некоторых наборах инструментов можно отключить все обновления при загрузке списка, а затем просто показать результаты после завершения загрузки. Возможно ли что-то подобное в GtkTreeView?

Или я могу сделать что-то еще? Как поставить эту функцию в поток? Или любое другое решение?

Спасибо за совет заранее!

1 Ответ

1 голос
/ 15 декабря 2011

Я не совсем уверен, каково ваше требование.К сожалению, у меня нет опыта работы с MySQL.Но что касается использования GtkEntryCompletion с GtkEntry для получения эффекта «поиск по мере ввода», вы должны создать GtkEntryCompletion и установить его на GtkEntry.Затем вы можете установить модель для завершения записи, из которой выбираются данные завершения.Вот пример кода, основанного на исходном коде gtk-demo и коде coding.debuntu.org:

#include <gtk/gtk.h>
#include <string.h>

static gboolean
on_match_select(GtkEntryCompletion *widget, GtkTreeModel *model,GtkTreeIter *iter, gpointer user_data)
{
    GValue value = {0, };
    GValue id = {0, };
    gtk_tree_model_get_value(model, iter, 1, &value);
    gtk_tree_model_get_value(model, iter, 0, &id);
    fprintf(stdout, "You have selected value=\"%s\" with id = %d\n",
        g_value_get_string(&value),
        g_value_get_int(&id));
    g_value_unset(&value);
    g_value_unset(&id);

    return FALSE;
}

/* Creates a tree model containing the completions */
static GtkTreeModel *
create_completion_model (void)
{
    GtkListStore *store;
    GtkTreeIter iter;
    int id = 0;
    char buffer[1024]={0,};

    store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);

    /* Here we add the data to be shown for completion */
    /* Add 10000 strings */
    for(id = 0; id < 10000; id++)
    {
        if(id%2)
            snprintf(buffer, sizeof buffer -1, "homer #%d with %d", id/2, id);
        else
            snprintf(buffer, sizeof buffer -1, "marge #%d with %d", id/2, id);

        gtk_list_store_append (store, &iter);
        gtk_list_store_set (store, &iter, 0, id, 1, buffer, -1);
    }
    return GTK_TREE_MODEL (store);
}


int main (void)
{
    GtkWidget *window;
    GtkWidget *vbox;
    GtkWidget *label;
    GtkWidget *entry;
    GtkEntryCompletion *completion;
    GtkTreeModel *completion_model;

    gtk_init (NULL, NULL);
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window),"Sample entry completion");
    g_signal_connect (window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    vbox = gtk_vbox_new (FALSE, 5);
    gtk_container_set_border_width (GTK_CONTAINER (window), 5);
    gtk_container_add(GTK_CONTAINER(window), vbox);

    label = gtk_label_new (NULL);
    gtk_label_set_markup (GTK_LABEL (label),
                        "Completion demo, try writing <b>homer/marge #...</b>; replace ... by a number b/w 0 &amp; 9999.");

    gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);

    /* Create our entry */
    entry = gtk_entry_new ();
    gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);

    /* Create the completion object */
    completion = gtk_entry_completion_new ();

    /* Assign the completion to the entry */
    gtk_entry_set_completion (GTK_ENTRY (entry), completion);
    g_object_unref (completion);

    /* Create a tree model and use it as the completion model */
    completion_model = create_completion_model ();
    gtk_entry_completion_set_model (completion, completion_model);
    /* Connect callback for match selection */
    g_signal_connect(G_OBJECT (completion), "match-selected", G_CALLBACK (on_match_select), NULL);
    g_object_unref (completion_model);

    /* Use model column 1 (i.e. 2nd column) as the text column */
    /* Model currently used has int (id) in 1st column & string (data) in 2nd column */
    gtk_entry_completion_set_text_column (completion, 1);

    gtk_widget_show_all (window);
    gtk_main();

    return 0;
}

Надеюсь, это немного быстрее, чем ваш текущий метод.
Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...