Управление работой рабочих потоков через основной поток - PullRequest
0 голосов
/ 01 июля 2010

Эй, я не уверен, что об этом уже спрашивали.(По крайней мере, я не нашел ответов на эти конкретные вопросы).Но:

У меня есть программа, которая при запуске создает окно входа в новую UI-тему.

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

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

Но я не уверен, как это сделать: 1. Должен ли я разрешить UI-Thread Queue APC в основной поток (но затемОсновной поток не знает о происходящем. 2.) Могу ли я лучше использовать объекты событий для ожидания и очереди для передачи данных из одного потока в другой? ...

Или есть способ лучшепараметры?

Например: я запускаю клиент: 1. Клиент загружает данные из файла и выполняет некоторую инициализацию

Клиент создает окно в новом потоке, которое обрабатывает введенные пользователем данные для входа в систему.

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

Клиент должен теперь упаковать данные и делегировать отправляющую работу другому объекту (например, CSingleConnection), который обрабатывает отправку данных по сети (конечно же,для этого не требуется новый поток, поскольку он может обрабатываться с помощью перекрывающегося ввода-вывода ...

Один специальный поток-получатель получает данные с сервера и обрабатывает их обратно клиенту, который, в свою очередь, оценивает данные.

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

Затем клиент создает новое окно, которое будет обрабатывать пользовательский интерфейс чата

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

(надеюсь, это поможет мне получить то, что я пытаюсь) ...

Ответы [ 2 ]

0 голосов
/ 01 июля 2010

Я не знаю, хороший это стиль или нет (отвечая на Ваш собственный вопрос):

Но я думаю, что я иду с объектами событий и двумя очередями (одна для соединения между клиентом и соединением, а другая для связи между клиентом и пользовательским интерфейсом) ...

0 голосов
/ 01 июля 2010

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

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

В любом случае, я с большим удовольствием использовал Qt sig и slots именно для этой цели.Я искренне согласен с тем, что GUI никогда не должен зависать.

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