Здравствуйте, гость ( Вход | Регистрация )
wolf.diesel | Дата 14.7.2010, 17:56 |
Пардон, неправильно выразился QtConcurrent - подобных библиотек. Я согласен, что метод мной приведенный работает далеко не всегда и, все ж таки, придется юзать мьютексы и прочие прелести тредов, но то, что я написал, хотя бы, даст пинка мысли ) Начало. Ато человек вконец запутался, как я посмотрел ) |
|
Алексей1153 | Дата 13.7.2010, 18:26 |
без применения всяких вытесняющих технологий а что за технологи такие ? |
|
wolf.diesel | Дата 13.7.2010, 9:29 |
Вообще, чтобы небыло подобных вопросов о межпроцессном взаимодействии, уясни одну вещь: каждый поток выполняется в своем пространстве и со своей памятью. Чтобы изменить ЛЮБЫЕ данные ЛЮБОГО потока твоей аппликухи, ты должен использовать ПОТОКОБЕЗОПАСНЫЕ методы. Это касается не только кути фреймворка. Это стандарт. Так вот, для тебя было бы проще описать в классе главного окна слот, который бы принимал данные от потока, а в потоке описать сигнал(окончания действия, к примеру), который будет вызываться только по окончании работы и внутренней подготовки данных. Далее, при создании потока ты будешь делать connect(thread, SIGNAL(метод_который_описан_как_сигнал(record *)), widget, SLOT(слот_описанный_тобой_для_компонента_или _формы(recod *)); обрати внимание, что слот и сигнал имеют в параметре одинаковый тип данных(!). А далее, в слоте уже делай с данными все, что пожелаешь. Можешь даже уничтожить, не читая Это называется потокобезопасное программирование, без применения всяких вытесняющих технологий ) Только помни, что данные, которые ты передаешь между потоками должны быть созданы в куче, а не в стеке. То есть
Ну и позаботиться об удалении, после использования неплохо бы:
Надеюсь, идея понятна ) |
|
wiz29 | Дата 28.6.2010, 15:26 |
т.е. если у меня двух ядерник, то лучше всего не более двух потоков использовать, я правельно понял?))) Используй QtConcurrent чтобы не заморачиваться на вычисление оптимального числа потоков |
|
Алексей1153 | Дата 26.6.2010, 5:17 |
поставил за одно в него qApp->procecEvent(): кстати, функция статическая, можно QApplication::processEvents(); вернее, даже QCoreApplication::processEvents(); |
|
eldar85 | Дата 25.6.2010, 21:39 |
а все, я разобрался почему))) дело было в том что я ставил ожидание в секунду в цикле запуска потоков, в итоге главное окно ждало когда закончиться цикл и только после этого обновляло окошко ... если ожидание из цикла убрать и поставить в метод run() то тогда все cool... да проект то и так не сложный, примерно так как вы и сказали, одна кнопка, одно текстовое поле и класс для потоков... главное что я понял что задерживало вывод в тектовое поле, это долбынный цикл)) и поставил за одно в него qApp->procecEvent(): вот и все)) большое спасибо за помощ)) |
|
Litkevich Yuriy | Дата 25.6.2010, 20:42 |
eldar85, ты всё же сделай примитивный проект, окно с кнопкой и меткой, при нажатии на кнопку в метку помести текст "начали", затем запускай потоки, которые что-то будут делать, например большие циклы. По завершении потоков выводи в метку "закончили". Если с таким приложением будут проблемы - выкладывай в форум. |
|
Алексей1153 | Дата 25.6.2010, 20:16 |
попробуй processEvents()
|
|
eldar85 | Дата 25.6.2010, 20:10 |
все работает отлично, вот только еще с одним бы разобраться, допустим я запустил десять потоков в таком плане
так вот, в текстовое поле все выводиться лишь после того как все потоки закончатся, а нельзя ли сделать так чтобы поток выполнил свое действие и вывел на экран свое значение, и так далее, а то к примеру у меня один поток может выполняться 2 секунды, а другой возможно несколько минут и тогда получиться что они друг друга будут ожидать пока все не закончаться, а если их сделать 20...100 то вообще как то будет не к стати... может знаете как так сделать??? я тут в цикле специально секунду поставил ожидание, чтобы посмотреть как будет выводиться и вот и вышло что пока не пройдет 10 сек то на текстовое поле нифига ничего не выводиться... только когда все потоки все сделают... |
|
Алексей1153 | Дата 25.6.2010, 19:55 |
Ага, вижу косяк, спецификатор доступа не переопределил
|
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 20.4.2024, 6:14 |