看板 C_and_CPP 關於我們 聯絡資訊
是這樣的 原本的 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