我尝试使用GtktreeView在C中显示mysql查询的结果,其中包含以下代码,该代码从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中是可能的吗?
或者我能做点别的吗?比如把这个函数放在线程中?或任何其他解决方案?
感谢你对我的建议!
发布于 2011-12-15 19:07:24
我不太清楚你的要求是什么。不幸的是,我之前也没有使用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 & 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;
}希望这比你当前的方法快一点。
希望这能有所帮助!
https://stackoverflow.com/questions/8481172
复制相似问题