作者DrStein (啤酒肚)
看板C_and_CPP
標題[問題] gtk+ 構件的釋放..
時間Thu Jun 16 19:27:13 2011
是這樣的 原本的 main函數 開了個GtkWidget當窗口:
但這窗口特性是什麼 都還沒定
但中間開了個線程 把 GtkWidget的指標傳過去:
gtk_init(NULL, NULL);
GtkWidget *pGtkWindow;
pGtkWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
pThread(..pGtkWindow );
:
:
gtk_widget_show_all(pGtkWindow);
gtk_main();
到了線程中 開始定 pGtkWindows的特性:
GtkWidget *pGtkImage;
GdkPixbuf *pGtkPixbuf;
char *pBuf;
pBuf = (char*)malloc(width*height);
memset(pBuf, 156, fbWidthStep*256);
pGtkPixbuf = gdk_pixbuf_new_from_data ( pBuf,
GDK_COLORSPACE_RGB, false, 8,
width, height, widthStep, NULL, NULL);
pGtkImage = gtk_image_new_from_pixbuf(pGtkPixbuf);
gtk_container_add(GTK_CONTAINER(pWindow),pGtkImage);
然後運行時就會有下面警告:
Gtk-WARNING **: Attempting to add a widget with type GtkImage to a GtkWindow,
but as a GtkBin subclass a GtkWindow can only contain one widget at a time;
it already contains a widget of type GtkImage
看來是 那行gtk_widget_show_all()自己去件了個GtkImage
那就要在我添上我建的Gtkimage前, 要刪除它自建的GtkImage
但我不知道他自建的GtkImage是在那啊... 所以不能用
gtk_widget_destroy刪掉啊...
那請問要怎作才能刪除呢?
還有 那線程會建/刪多次GtkImage...一次也只要一個GtkImage
所以用個可以裝多GtkImage的容器也沒什麼意思..
我現在是這樣做:
/*建構*/
pGtkPixbuf = gdk_pixbuf_new_from_data ( (guchar*)pBuf,
GDK_COLORSPACE_RGB, false, 8,
fbWidth, fbHeight, fbWidthStep, NULL, NULL);
pGtkImage = gtk_image_new_from_pixbuf(pGtkPixbuf);
g_object_ref(pTargetWindow);
gtk_container_add(GTK_CONTAINER(pWindow),pGtkImage);
gtk_widget_queue_draw(pWindow);
/* 刪掉*/
if(NULL != pTargetWindow && NULL != pGtkImage)
gtk_container_remove(GTK_CONTAINER(pTargetWindow),pGtkImage);
if(NULL != pGtkImage)
gtk_widget_destroy(pGtkImage);
/*報錯
Gtk-CRITICAL **: IA__gtk_widget_destroy: assertion `GTK_IS_WIDGET (widget)'
failed */
pGtkImage = NULL;
if(NULL != pGtkPixbuf)
gdk_pixbuf_unref(pGtkPixbuf);
pGtkPixbuf = NULL;
if(NULL != pBuf)
free(pBuf);
pBuf = NULL;
然後重複建/刪 就會掛調 記憶體位制不對
那請問我要怎做才比較好呢 謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.158.204
※ 編輯: DrStein 來自: 59.120.158.204 (06/16 20:03)
推 Bencrie:在 thread 裡面改另一個視窗的屬性你不覺得會有問題嗎 囧 06/16 22:08
→ DrStein:那請問要怎做比較好呢 謝謝 06/16 23:04