NSThread и взаимодействие UIViewController

Как насчет использования pid_t gettid(void); или pthread_t pthread_self(void)?

Оформить заказ https://www.systutorials.com/docs/linux/man/2-gettid/

#include 
pid_t gettid(void);

Или с помощью pthread: как получить идентификатор потока pthread в программе linux c?

5
задан Airsource Ltd 3 October 2008 в 15:42
поделиться

4 ответа

В Вашем случае это действительно зависит от того, что происходит в [приложение changeView], но причина, это прекращает отвечать, наиболее вероятна, что у Вас нет событий диспетчеризации цикла выполнения на Вашем новом, вторичном потоке (больше на этом ниже). В целом, однако, это - очень плохая идея обновить GUI от вторичного потока. Поскольку Вы уже обнаружили, все эти события должны пройти основной поток.

Главная причина, что Ваш второй пример работает и не Ваше первое, состоит в том, что UIApplication настраивает и обрабатывает цикл выполнения и диспетчера события для Вас на основном потоке. Так, при вызове performSelectorInMainThread селектор отправлен основному циклу выполнения, который может затем обработать вход gui и другие события. Диспетчер события также выполняется и управляется UIApplication на основном потоке.

Так в основном не выполняйте операции управления GUI по вторичному потоку. Диспетчеризируйте тех, которые к основному потоку. И если Вам нужна обработка на вторичном потоке (для вещей как таймеры или асинхронные вызовы, и т.д.) затем необходимо запустить и управлять собственным циклом выполнения на том потоке (см. NSRunLoop для больше при управлении Вашим на выполненном цикле).

2
ответ дан 14 December 2019 в 13:51
поделиться

Просто найденный этим в документах поточной обработки iPhone

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

Я все еще не вижу то, что на самом деле заставило бы что-то отображаться, но не мочь получить ввод данных пользователем, но я буду следовать той инструкции в будущем.

2
ответ дан 14 December 2019 в 13:51
поделиться

Как в документации говорится, "Если Вы не уверены в конкретной графической операции, запланируйте выполнение ее от Вашего основного потока".

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

2
ответ дан 14 December 2019 в 13:51
поделиться

Почти ни один из кода UI в UIKit или AppKit не ориентирован на многопотоковое исполнение. То, как это перестало работать, не важно, потому что, если Вы волнуетесь о том, как это перестало работать, Вы делаете что-то, что собирается привести ко всем видам странных ошибок, которые тонко изменятся между другой версией ОС так или иначе.

Мой лучший совет не состоит в том, чтобы использовать вещи от фоновых потоков, если в документах не говорится, что это безопасно.

0
ответ дан 14 December 2019 в 13:51
поделиться
Другие вопросы по тегам:

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