Как обмениваться данными между потоком GUI и рабочим потоком?

Мое приложение представляет собой простой отправитель/получатель сообщений через TCP/IP с графическим интерфейсом. До сих пор все было одним потоком, но я хотел бы разделить блок связи TCP/IP и графический интерфейс на отдельные потоки. Насколько я понимаю, мне нужна общая структура данных (например, QQueue‹QString›) для передачи сообщений туда и обратно между потоком GUI и потоком TCP/IP.

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


person alexrc    schedule 03.05.2013    source источник
comment
Вы должны использовать слоты и механизм сигналов Qt для обмена данными между потоком GUI и рабочим потоком.   -  person Cameron Tinker    schedule 03.05.2013
comment
Прикомандирован... если вам все равно нужно сигнализировать о том, что новые данные доступны (кажется вероятным), просто используйте сам сигнал для передачи данных. Если это много данных, которые вы не хотите копировать слишком много, то, возможно, перейдите к использованию QMutex для управления доступом к общему списку или очереди.   -  person darron    schedule 03.05.2013
comment
возможный дубликат обмена данными между потоками Qt   -  person cmannett85    schedule 03.05.2013
comment
@darron: да, я бы пошел на использование очереди с QMutex, но я сомневался, где ее объявить: если я объявлю ее в одном потоке, сможет ли другой поток получить к ней доступ?   -  person alexrc    schedule 03.05.2013
comment
Функция @alexrc и члены данных экземпляров класса и т. Д. Полностью могут использоваться из других потоков ... поэтому вам нужен QMutex, чтобы предотвратить плохие вещи, которые могут произойти при попытке изменить материал одновременно. Если у них есть указатели друг на друга, они могут делать все, что захотят. Просто добавьте то, что вам нужно, в класс потока и предоставьте общедоступные методы доступа, чтобы другой поток мог их вызывать.   -  person darron    schedule 03.05.2013
comment
Хотя... Я бы еще раз упомянул, что в зависимости от того, что вам нужно передать, просто использование сигналов и слотов, возможно, будет проще/чище.   -  person darron    schedule 03.05.2013


Ответы (1)


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

Попросите «поток потока» (из вашего потока TCP/IP) поместить данные в буфер. Пусть ваш «поток чтения» (из вашего графического интерфейса) извлекает данные из буфера.

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

Джон

person John Kroetch    schedule 03.05.2013