Переключение контекста потока - PullRequest
3 голосов
/ 09 ноября 2010

Я работаю над проектом C / C ++, который включает в себя пользовательский интерфейс и фоновый сервис, который выполняет тяжелую обработку, извлекая данные по сети. Чтобы мой пользовательский интерфейс не переставал отвечать, я хотел бы создать отдельный поток, а затем вызвать фоновую службу в этом потоке, в то время как другой поток отобразит индикацию занятости в пользовательском интерфейсе. После того, как фоновая служба завершит свою работу, я бы хотел переключить контекст потока с фонового потока на поток пользовательского интерфейса, чтобы индикация занятости была удалена и могли отображаться дальнейшие потоки экрана. Я считаю, что это обычный способ работы большинства интерфейсов. Я хотел бы знать, каковы эффективные и лучшие способы достижения этого. На данный момент у меня нет кода, реализованного для вышеизложенного, и я просто прошу идеи и лучшие способы сделать это.

Платформа - Linux. Платформа пользовательского интерфейса, которую я использую, представляет собой пользовательскую платформу пользовательского интерфейса, которая предоставляет SDK для разработки пользовательского интерфейса, но в отличие от большинства платформ пользовательского интерфейса она ничего не даст для упомянутого мной сценария. Это почти устаревший фреймворк, но его нужно использовать для этого проекта, что является болезненным, поэтому единственный вариант - я могу использовать Pthread или System v с некоторыми обертками для реальных вызовов, что поможет мне сохранить переносимость реализации на разных платформах.

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

Ответы [ 3 ]

6 голосов
/ 09 ноября 2010

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

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

Наконец, пользовательские интерфейсы обычно имеют управляемую событиями архитектуру. Обычно у вас есть «основной» поток, запускающий цикл обработки событий, который обрабатывает различные события. Таким образом, правильный способ сделать то, что вам нужно, - это чтобы фоновый поток публиковал события прогресса в «главном» потоке. И вы должны сделать это потокобезопасным способом; точные детали зависят от инструментария пользовательского интерфейса.

0 голосов
/ 09 ноября 2010

Позвольте мне попытаться помочь вам с ответом высокого уровня.

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

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

удачи

0 голосов
/ 09 ноября 2010

У меня есть пример кода для создания и использования потока и мьютекса с pthreads. Потоки в примере одновременно блокируют мьютекс / увеличивают переменную / разблокируют мьютекс. Недостающий бит, который может вам понадобиться, является условной переменной (тот же шаблон инициализации), и тогда он будет иметь полный набор минимально необходимых примитивов для реализации потока вашего бегуна задач на основе pthread. И вы не будете зависеть от какой-либо сторонней библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...