Название: Поток ГУИ и другой поток с циклом while Отправлено: crashtua от Апрель 28, 2011, 12:09 Есть у нас главный поток с ГУИ, есть другой поток, в котором запущена одна штука, которая работает через безконечный цикл while. Как передать данные из ГУИ в тот поток, если он постоянно знят? Какими средствами можно сделать типа такого:в потоке ГУИ создаем очередь сообщений, а в другом потоке в цикле while мы их забираем из потока ГУИ?
Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: BRE от Апрель 28, 2011, 12:12 http://www.prog.org.ru/topic_14426_0.html
Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: crashtua от Май 01, 2011, 18:22 Остановился на варианте
Код: class MessageStack Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: Igors от Май 01, 2011, 19:32 Остановился на варианте Ну варианта пока нет - это Вы защитили данные, а надо еще синхронизировать запись/чтение. Можно напр такКод
Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: andybeg от Май 01, 2011, 20:00 мне многое открыла бланшет, там про ЭТО есть :)
Бланшет,Саммерфилд - QT4 Программирование GUI на С++.2ed.2008.djvu Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: crashtua от Май 01, 2011, 20:27 Igors, а как add знает, что в данный момент get не забирает меседж??
Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: crashtua от Май 01, 2011, 20:27 мне многое открыла бланшет, там про ЭТО есть :) почитаем, спасибо.Бланшет,Саммерфилд - QT4 Программирование GUI на С++.2ed.2008.djvu Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: Igors от Май 02, 2011, 10:38 Igors, а как add знает, что в данный момент get не забирает меседж?? Он и не знает, просто ждет на локе, т.е. это задача блокировки. Кстати: QReadWriteLock здесь не подходит т.к. 2 или более ниток не могут одновременно делать pop (это не "чтение"). Поэтому замените его на обычный мутексНазвание: Re: Поток ГУИ и другой поток с циклом while Отправлено: crashtua от Май 02, 2011, 13:53 Может быть так:
Код: #pragma once Код: #include "GHQtCommandStack.h" Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: Igors от Май 02, 2011, 14:59 Может быть так: Зависит от того что надо. Так у Вас нитка "ничего не ждет" - это разумно если ей есть еще чем заниматься, а иначе она будет крутиться на get и бестолково жечь процессор. Также возврат "empty" не выглядит хорошо (как потом ее отличить от "реальной" строки?), лучше немного изменить get. Также с QMutexLocker (вместо lock/unlock) будет заметно короче.Кстати, в данной ситуации, get() выполняется только нитью, которая создала GHQtCommandStack, а add() ГУИ нитью, и больше их не планируется, но все равно, хотелось бы все нюансы узнать... Как правило "используя допущения задачи" выиграть/сэкономить ничего не удается. Multi-thread конструкция либо работает для любого числа ниток - либо не работает вообще.Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: crashtua от Май 02, 2011, 16:38 нитка "ничего не ждет" Тоесть если mutex уже залочен то get ничего не обработает? А как заставить нитку ждать? А про возврат "empty"-формат строк используемый приложением своеобразный, в каждой "правильной" строке первым идет символ "!", так что переделывать get буду в самом конце...Название: Re: Поток ГУИ и другой поток с циклом while Отправлено: Igors от Май 02, 2011, 18:03 Тоесть если mutex уже залочен то get ничего не обработает? А как заставить нитку ждать? Если мутекс захвачен (одной из ниток), то все остальные (что пытаются его получить) будут ждать. В Вашем случае мутекс захватывается на очень короткое время (push/pop) поэтому просто так крутить get в цикле while нехорошо. Поставьте waitCondition или семафор (см. пример выше). |