QCoreApplication :: processEvents - почему он должен вызываться только из основного потока? - PullRequest
2 голосов
/ 24 октября 2019

Поскольку существует только один QCoreApplication объект, почему важно, из какого потока вызывается QCoreApplication::processEvents()?

В конце концов, все потоки имеют одинаковое адресное пространство.

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Ваш заголовок не соответствует действительности. Возможно, вы предполагаете, что QCoreApplication::processEvents является общесистемным вызовом «Обработка всех возможных событий всех потоков», а это не так. Вы можете вызывать его из любого потока, в котором вы находитесь (и который выполняет цикл обработки событий).

Почему важно, из какого потока он вызывается: В Qt цикл обработки событий является ресурсом для каждого потока (выможет запустить собственный цикл событий в любом потоке) и QCoreApplication::processEvents обрабатывает очередь событий текущего потока.

1 голос
/ 24 октября 2019

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

...