Russian Qt Forum

Qt => Общие вопросы => Тема начата: ilyagoo от Декабрь 10, 2008, 11:37



Название: обмен данными между потоками
Отправлено: ilyagoo от Декабрь 10, 2008, 11:37
в главном gui потоке создаются n потоков. каждый из них получает массивы данных. как эти данные вытащить?
судя по всему, передача указателя не сработает, т.к. массив будет находиться в другой нити.


Название: Re: обмен данными между потоками
Отправлено: pastor от Декабрь 10, 2008, 11:56
судя по всему, передача указателя не сработает, т.к. массив будет находиться в другой нити.

сработает, только нужно позаботится синхронизации потоков. Посомтрите Thread Support in Qt (http://doc.trolltech.com/4.4/threads.html)

Другой вариант воспользоваться qtsharedmemory (http://doc.trolltech.com/solutions/4/qtsharedmemory/) из Qt Solutions


Название: Re: обмен данными между потоками
Отправлено: Tonal от Декабрь 11, 2008, 09:06
qtsharedmemory то зачем? Оно для коммуникации между процессами.
Потоки разделяют все данные, так что кроме синхронизации тут ничего не нужно. :)


Название: Re: обмен данными между потоками
Отправлено: pastor от Декабрь 11, 2008, 13:27
Оно для коммуникации между процессами.

Нетолько, можно использовать и между потоками (http://doc.trolltech.com/solutions/4/qtsharedmemory/threadcounter.html).


Название: Re: обмен данными между потоками
Отправлено: Tonal от Декабрь 11, 2008, 14:58
Если можно подождать с обработкой до тех пор, пока все данные не приедут, я бы делал так:
1. распределял новый блок данных в слушающем потоке и ждал данных;
2. забивал его данными;
3. когда данные кончились выбрасывал сигнал с указателем на блок;
4. Переходил в п1

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