Получить объект, созданный в дочернем потоке, обратно в основной поток

1

Предположим, я хочу создать 500 wxWidget как (некоторые панели, цветные кнопки и текст ctrl и т.д.), я должен создать все это за один раз, но это заморозит мой основной поток, поэтому я помещаю эту часть создания в дочерний поток и показать некоторый gif anim в основной теме. Но я не смог получить все эти объекты wxWidget, созданные в моем кадре, в дочернем потоке.

Могу ли я получить этот wxWidgets (созданный в дочернем потоке) в основном потоке.   просто рассмотрим случай, когда мне нужно создать дочерние элементы фрейма в дочернем потоке и анимации анимации основного потока. после того, как дочерняя нить закончит, все дочерние элементы, созданные в дочернем потоке, будут доступны в основном потоке.

Любая помощь действительно заметна.

Я использую python 2.5, wxpython 2.8 на windowsxp.

  • 0
    Я не знаю, можно ли отправлять объекты виджетов, если это так, это было бы грязно. Почему бы вам не избавиться от хлопот и не создать виджеты в главном потоке, а использовать дочерний поток, чтобы показать диалог прогресса или что-то еще ... Это избавит вас от многих головных болей.
  • 0
    На самом деле мне нужно создать так много виджетов одновременно, если я займусь созданием виджетов в главном потоке, то графический интерфейс будет зависать.
Показать ещё 2 комментария
Теги:
wxpython

2 ответа

2
Лучший ответ

Вы можете использовать pubsub, который включен в wxpython - wx.lib.pubsub.

См. мой ответ здесь для базового примера использования для межпоточных комм.


В качестве альтернативы: пример использования wx.Yield для обновления вашего окна.

import wx

class GUI(wx.Frame):
    def __init__(self, parent, title=""):
        wx.Frame.__init__(self, parent=parent, title=title, size=(340,380))
        self.SetMinSize((140,180))

        self.creating_widgets = False

        self.panel = wx.Panel(id=wx.ID_ANY, parent=self)

        self.startButton = wx.Button(self.panel, wx.ID_ANY, 'Start')
        self.stopButton = wx.Button(self.panel, wx.ID_ANY, 'Stop')
        self.messageBox = wx.TextCtrl(self.panel, wx.ID_ANY, '', size=(75, 20))

        self.Bind(wx.EVT_BUTTON,  self.onStart, self.startButton)     
        self.Bind(wx.EVT_BUTTON,  self.onStop, self.stopButton)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.startButton, 0, wx.ALL, 10)
        self.sizer.Add(self.stopButton, 0, wx.ALL, 10)
        self.sizer.Add(self.messageBox, 0, wx.ALL, 10)

        self.panel.SetSizerAndFit(self.sizer)

    def onStart(self, event):
        self.creating_widgets = True
        count = 0
        self.startButton.Disable()
        while self.creating_widgets:
            count += 1
            #Create your widgets here

            #just for simulations sake...
            wx.MilliSleep(100)
            self.messageBox.SetLabel(str(count))

            #Allow the window to update, 
            #You must call wx.yield() frequently to update your window
            wx.Yield()

    def onStop(self, message):
        self.startButton.Enable()
        self.creating_widgets = False


if __name__ == "__main__":

    app = wx.PySimpleApp()
    frame = GUI(None)
    frame.Show()
    app.MainLoop()
  • 0
    На самом деле я просто хочу создать wxWidgets / wxObject в дочернем потоке и вернуться в основной поток, PUbsub может использовать только как отправитель прослушивателя сообщений, я не могу понять, как использовать pubsub в моем случае.
  • 0
    Вы передаете объект виджета в дочернем потоке и настраиваете слушателя для этого в основном потоке
Показать ещё 2 комментария
0

Вы можете отправить их обратно в очередь, или все это происходит в одном экземпляре класса, назначьте виджеты в известное место в экземпляре для основного потока, чтобы забрать их. Сигнал через семафор.

  • 0
    немного больше описания может действительно помочь мне
  • 0
    Работающая реализация была бы еще лучше, но вам нужно показать работающий (или нерабочий) пример вашего кода и проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню