2012-01-12 44 views
0

在我們的項目中,我們使用的是gtkmm,我們有幾個類擴展Gtk::Window以顯示我們的圖形界面。gtkmm-Window仍爲空

我現在發現了什麼調用產生的行爲(在以前的版本中描述。現在的問題略有改變。)

我們顯示一個窗口,就像一個魅力。

然後,我們有一個窗口顯示各種狀態消息。我們稱之爲MessageWindow。它有一個方法setMessage(Glib::ustring msg),它簡單地調用標籤的set_text()

經過一些處理後,我們再次隱藏這個窗口,我們現在顯示一個工具欄。只是又一個簡單的窗口,沒什麼瘋狂的。

適用於所有窗口:主窗口在窗口上調用show()並創建一個新線程,該線程調用Gtk::Main::run()(不帶參數)。

這就是它應該如此,直到現在。

問題從這裏開始:現在主線程想要調用MessageWindow::setMessage("any string")。 a)如果我調用這個方法,消息窗口完全正確地反應。 但之後,工具欄窗口顯示爲空。 b)如果我不叫它,消息窗口不會改變標籤(這是絕對清楚的),並且工具欄窗口顯示爲它應該。

看起來像窗戶彼此混淆。

現在的問題:

如果我的GUI線程被阻塞Gtk::Main::run(),我怎麼能現在更改標籤的文本?

我們使用gtkmm-2.4(不,我們不能升級)

任何幫助表示讚賞。

回答

1

哇!這很複雜...

第一:你不應該操縱幾個線程的窗口。那就是你應該只有一個GUI線程來完成所有的GUI工作,並讓其他線程與它通信。

理論上可以使它工作(在Linux中;在Windows中是不可能的),但它比它的價值更麻煩。

第二:行Gtk::Main main(argc, argv)不是調用,它是一個對象聲明。對象主要應該在程序期間存活,所以如果你在對象構造函數中使用它,一旦你從它返回,對象將被銷燬!把它放在主要功能的頂部,忘掉它。

UPDATE:這裏我常用的方法是創建一個管道,一個g_io_channel讀取,並在另一端寫入字節。

其他選項,雖然我沒有測試它是調用讓主線程的GMainContext,然後g_idle_source_new()和源附加到主背景與g_source_attach()。如果你嘗試這個,它的工作原理,請在這裏發佈你的結果!

+0

感謝您的回覆。我知道'Gtk :: Main'的生命週期。這件東西只要控制器一直存在。通常,我只從同一個線程訪問GUI。但有一個例外,這似乎是造成這個問題。我正在修改我的問題 – Atmocreations 2012-01-12 15:46:27

+0

但請注意,創建Gtk :: Main的線程應該是唯一一個創建窗口並操縱它們的線程。你的問題似乎意味着你在一個線程中調用'show'並在另一個線程中調用'run'。 – rodrigo 2012-01-12 16:30:26

+0

是的。這就是我正在做的事情。似乎沒有任何問題......但如何解決呢?從gui中運行所有的操作? – Atmocreations 2012-01-12 16:35:08