Невозможно запустить фоновый поток и загрузить графический интерфейс wx одновременно - PullRequest
0 голосов
/ 24 марта 2019

Чтобы подвести итог моей проблемы, я хочу загрузить основной макет моих программ, но в то же время запустить фоновый демон для проверки задач в базе данных и уведомления пользователя.Я выполняю демон в потоке с помощью wx.CallAfter, но при загрузке программы графический интерфейс останавливается, пока поток не обрабатывает все уведомления, а затем загружает == он не работает в фоновом режиме.

В основном я пытался: - запустить скрипт в потоке - запустить поток с методом CallAfter

Вот фрагмент моего мэйнфрейма (только его часть слишком большая):

[code]
class MyForm(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "ICSOFT", size = (1400,700))

[...]
    wx.CallAfter(notdaemon)

[...]
def notdaemon():
    import notdaemon
    thread = threading.Thread(target=notdaemon.rundaemon(None), args=())
    thread.daemon = True
    thread.start()


# Run the program
if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm()
    frame.Show()
    app.MainLoop()

вот выдержка из notdaemon:

def rundaemon(self):
    for i, a in reminders.items():
        [...]
        notwin = wx.adv.NotificationMessage(u'test', message=msg, parent=None, flags=wx.ICON_INFORMATION)
        notwin.Show()
        time.sleep(5.5)

Таким образом, графический интерфейс пользователя просто зависает, пока rundaemon не отображает все уведомления ..

Любые идеи или помощь оченьвысоко ценится, спасибо :) 1013 *

1 Ответ

0 голосов
/ 24 марта 2019

Он зависает, потому что вы на самом деле запускаете функцию rundaemon при передаче ее в поток. На самом деле вы передаете возвращаемое значение, когда вы действительно собираетесь передать саму функцию.

Вместо этого:

thread = threading.Thread(target=notdaemon.rundaemon(None), args=())

Попробуйте это:

# notice the `rundaemon` function hasn't been called yet (parentheses have been removed)
thread = threading.Thread(target=notdaemon.rundaemon, args=())

Модуль Thread вызовет вашу функцию для вас, поэтому будьте осторожны, не вызывайте ее самостоятельно. Если вам нужно вызывать его с аргументами, укажите эти аргументы в кортеже args инициализатора класса Thread.

...