![]() |
|
![]() ![]() ![]() |
|
AntonTatu |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 12.4.2008 Репутация: нет Всего: нет |
Всем привет. Заранее извеняюсь что выложил много кода, хочется что бы при выполнении длительных расчетов не замирал интерфейс пользователя. В книге по QT "Бланшет,Саммерфилд - QT4 Программирование GUI на С++.2ed.2008.djvu" нашел примерчик, вроде все вычисления проводятся в отдельном потоке, но мне нужно записывать в статус бар значений счетчика после каждой итерации (функция Run::apply(const QString &str)), как это можно сделать в моем случае ?
|
||||||||||
|
|||||||||||
chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
извини, в коде копаться некогда да и не охото.
вот те пища для ....
Это сообщение отредактировал(а) chaos - 22.12.2009, 11:36 |
|||
|
||||
AntonTatu |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 12.4.2008 Репутация: нет Всего: нет |
мне к сожалению такой вариант не подходит.... |
|||
|
||||
chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
AntonTatu,
ну вот вполне рабочий пример, выдуманный правда
upd: чот я запарился: перепутал статус бар с прогрес Это сообщение отредактировал(а) chaos - 22.12.2009, 11:58 |
|||
|
||||
AntonTatu |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 12.4.2008 Репутация: нет Всего: нет |
У меня засада в том что после вызова потока, вызывается "мояфункция," записанная в "мояфункция.цпп", и при ее выполнении мне нужно каким то образом делать emit calcStageChange(i), как ей передать этот сигнал ? protected: void run() { while (true) { for (int i = 0; i < 100; i++) { emit calcStageChange(i); QThread::usleep(10000); } мояфункция(int,int) for (int i = 99; i >= 0; i--) { emit calcStageChange(i); QThread::usleep(10000); } } } }; |
|||
|
||||
chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 5 Всего: 44 |
AntonTatu, для функционирования сигналов и слотов необходимо быть QObject.
|
|||
|
||||
W4FhLF |
|
||||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 4 Всего: 121 |
У меня похожая ситуация. Вычислительное ядро ничего не знает о UI. Сделал так.
Есть синглтон TaskManager, в нём хранятся более простые объекты классов TaskProgress, каждый из которых хранит текущее значения завершённости какого-либо задания. Соответственно перед началоми каких-то долгих расчётов я создаю объект
и добавляю его в объект класса TaskManager:
Потом, в процессе расчётов просто изменяю состояние прогресса:
К синглтону можно получить доступ из любой части приложения. Соответственно в UI есть отдельный виджет, который отображает состояние менеджера заданий и обновляет его при необходимости. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||||
|
|||||||
Madonna |
|
|||
![]() Forbidden love... ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 22.1.2009 Где: Москва Репутация: 3 Всего: 4 |
Синглтон...
Какую реализацию синглтона использовать? Я в них совсем запуталась... Постановка задачи как у топикстратера. --------------------
Best regards, Madonna |
|||
|
||||
borisbn |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Создай интерфейс:
Наследуй от него свой TransactionThread:
Введи в Transaction функцию setListener
и перед запуском apply вызывай её
В функции apply вызывай
Это сообщение отредактировал(а) borisbn - 15.2.2010, 15:28 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||||
|
|||||||||||
W4FhLF |
|
||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 4 Всего: 121 |
Можешь использовать реализацию из библиотеки Loki:
Про то, что всё это значит можно почитать у автора библиотеки Александреску. Это сообщение отредактировал(а) W4FhLF - 15.2.2010, 15:35 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||
|
|||||
Madonna |
|
|||
![]() Forbidden love... ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 22.1.2009 Где: Москва Репутация: 3 Всего: 4 |
borisbn, спасибо.
W4FhLF, прочитала 30 страниц ...Александреску, мною плохо воспринимается. Гамма, которого я почему-то называю беттой ![]() Синглтон Loki, я так понимаю потокобезопасный. --------------------
Best regards, Madonna |
|||
|
||||
SABROG |
|
||||||||||
![]() Hacker ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2481 Регистрация: 18.9.2006 Репутация: 81 Всего: 91 |
Тема конечно свалилась уже в другое русло, но везде пишут, что синглтоны зло, одновременно и паттерн и анти-паттерн, о недостатках синглтона можно почитать в гугле.
Я так понимаю твоя проблема в том, что ты хочешь абстрагироваться от Qt и использовать некий код, который бы не зависел от других библиотек и легко внедрялся в любую другую среду. Тогда я вижу вариант с калбэками. Нужно только изменить прототип твоей функции, чтобы можно было передать в неё указатель на каллбэк функцию. Тогда ты сможешь независимо от среды передавать состояние. Тут - http://www.newty.de/fpt/callback.html есть пример как можно реализовать статическую каллбэк функцию являющуюся членом класса, нужно будет только модифицировать твой класс на базе QThread. Добавить метод, который будет эмитить сигнал.
Принцип простой - передаешь в свою функцию указатель на статический метод в QThread, а в этом методе делаешь свой emit через вызов метода класса:
Соответственно внутри твоей функции:
Ну и вызов твоей функции можно таким сделать:
--- Хотя думаю borisbn прав, тебе нужен паттерн Observer (наблюдатель). Listener более простой вариант. Это сообщение отредактировал(а) SABROG - 15.2.2010, 23:46 |
||||||||||
|
|||||||||||
Madonna |
|
|||
![]() Forbidden love... ![]() Профиль Группа: Участник Сообщений: 107 Регистрация: 22.1.2009 Где: Москва Репутация: 3 Всего: 4 |
Сразу я с шаблонами проектирования не знакома, но рано или поздно с ними приходится сталкиваться...
Есть куча вычислений в разных потоках, мне надо их отобразить в QProgressBar'ах. Есть 2 класса. MyThread и QMainWindow. В MyThread1 итерационные вычисления, их ход отображаются в ProgressBar1. Несколько таких пар. Это замечательно, но у меня более простые цели. Более того, я переписываю/пишу заново код с дибилдера....там они просто добавляют аналог QProgressBar как член класса например NewThread. Это сообщение отредактировал(а) Madonna - 16.2.2010, 00:55 --------------------
Best regards, Madonna |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Madonna, если в дебилдере добавить TProgressBar* в поток, то его функции (свойства) всё равно нельзя вызывать из потока. там используется механизм передачи сообщений SendMessage, правда скрытый за функцией TThread::Synchronize. В QT лучший способ - это механизм signal/slot.
Типа:
И только если необходимо сгенерить сигнал из объекта НЕ Q_OBJECT, тогда можно воспользоваться паттерном Observer (thx to SABROG, ) или callback'ом. P.S. синглтоны - реально зло. кучу раз на это наталкивался при поддержке чужого кода :( Это сообщение отредактировал(а) borisbn - 16.2.2010, 09:14 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |