Как отслеживать прогресс потока Python, не замораживая PyQt GUI?

Возможно, проще создать торговый календарь с нуля, например:

import datetime as dt

from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, \
    USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, \
    USLaborDay, USThanksgivingDay


class USTradingCalendar(AbstractHolidayCalendar):
    rules = [
        Holiday('NewYearsDay', month=1, day=1, observance=nearest_workday),
        USMartinLutherKingJr,
        USPresidentsDay,
        GoodFriday,
        USMemorialDay,
        Holiday('USIndependenceDay', month=7, day=4, observance=nearest_workday),
        USLaborDay,
        USThanksgivingDay,
        Holiday('Christmas', month=12, day=25, observance=nearest_workday)
    ]


def get_trading_close_holidays(year):
    inst = USTradingCalendar()

    return inst.holidays(dt.datetime(year-1, 12, 31), dt.datetime(year, 12, 31))


if __name__ == '__main__':
    print(get_trading_close_holidays(2016))
    #    DatetimeIndex(['2016-01-01', '2016-01-18', '2016-02-15', '2016-03-25',
    #                   '2016-05-30', '2016-07-04', '2016-09-05', '2016-11-24',
    #                   '2016-12-26'],
    #                  dtype='datetime64[ns]', freq=None)
19
задан tgray 25 February 2009 в 14:45
поделиться

5 ответов

Если Вы хотите использовать сигналы указать на продвижение к основному потоку затем, необходимо действительно использовать класс PyQt QThread вместо класса Потока от модуля поточной обработки Python.

А простой пример, который использует QThread, сигналы и слоты, может быть найден на PyQt Wiki:

https://wiki.python.org/moin/PyQt/Threading, _Signals_and_Slots

9
ответ дан 30 November 2019 в 04:54
поделиться

Я рекомендую Вам использовать Очередь вместо передачи сигналов. Лично я нахожу намного большим количеством устойчивого и понятного способа запрограммировать, потому что это более синхронно.

Потоки должны получить "задания" от Очереди и отложить результаты на другой Очереди. Все же третья Очередь может использоваться потоками для уведомлений и сообщений, как ошибки и "отчеты о выполнении работ". После того как Вы структурируете свой код этот путь, становится намного более просто справиться.

Таким образом, единственная "очередь заданий" и "Очередь результата" могут также использоваться группой рабочих потоков, это направляет всю информацию от потоков в основной поток GUI.

4
ответ дан 30 November 2019 в 04:54
поделиться

Если Ваш метод "processDoc" не изменяется, любые другие данные (просто ищет некоторые данные, и возвратите его и не заменяйте переменные или свойства родительского класса), можно использовать Py_BEGIN_ALLOW_THREADS, и макросы Py_END_ALLOW_THREADS ( посмотрите здесь для деталей ) в нем. Таким образом, документ будет обработан в потоке, который не заблокирует интерпретатор, и UI будет обновлен.

1
ответ дан 30 November 2019 в 04:54
поделиться

Вы всегда собираетесь иметь эту проблему в Python. Google GIL "глобальная блокировка межпретора" для большего количества фона. Существует два обычно рекомендуемых способа обойти проблему, которую Вы испытываете: используйте Скрученный или используйте модуль, подобный многопроцессорная обработка модуль, представленный в 2,5.

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

многопроцессорный модуль разветвит новый процесс и использует IPC, чтобы заставить его вести себя, как будто у Вас была истинная поточная обработка. Единственный недостаток - то, что Вам был бы нужен python 2.5, установленный, который является довольно новым и inst', включенный в большинство дистрибутивов Linux или OSX по умолчанию.

0
ответ дан 30 November 2019 в 04:54
поделиться

Собственные очереди Python не будут работать, потому что вам нужно заблокировать в очереди get (), что мешает вашему пользовательскому интерфейсу.

Qt по существу реализует систему очередей внутри для межпотоковой связи. Попробуйте использовать этот вызов из любого потока, чтобы отправить вызов слоту.

QtCore.QMetaObject.invokeMethod ()

Это неуклюже и плохо документировано, но он должен делать то, что вы хотите, даже из потока, отличного от Qt.

Вы также можете использовать для этого механизм событий. См. QApplication (или QCoreApplication) для метода, названного что-то вроде "post".

Edit: Вот более полный пример ...

Я создал свой собственный класс на основе QWidget. У него есть слот, который принимает строку; Я определяю его так:

@QtCore.pyqtSlot(str)
def add_text(self, text):
   ...

Позже я создаю экземпляр этого виджета в основном потоке графического интерфейса.

5
ответ дан 30 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: