Russian Qt Forum
Ноябрь 26, 2024, 14:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Зависает интерфейс программы нужна помощь....  (Прочитано 13129 раз)
Marat(Qt)
Гость
« Ответ #15 : Декабрь 24, 2009, 03:55 »

Если бы использовался QProcess вместо QThread, то можно было бы использовать сигнал readyReadStandardOutput. Альтернатива не самая веселая, но, судя по всему, вполне подходящая.
Записан
AntonUfo
Гость
« Ответ #16 : Декабрь 24, 2009, 11:35 »

это легко сделать "технически" (см. attachment). Но это идет вразрез с логикой примера, с именами переменных и.т.п. Подразумевается что "transaction" (класс Run) - это неделимая единица вычислений, которая не должна ничего знать об UI, не должна посылать сигналов и.т.п. Всем этим занимается класс TransactionThread.

Поэтому посмотрите как но не используйте, уберите бесконечность в Run но оставьте ее в TransactionThread

спасибо большое все работает теперь так как мне было нужно !!!!

а как тогда делать правильно, какой должен быть подход ?

у меня есть графический редактор, после построения в нем схемы мне нужно провести некотырые довольно медленные расчеты вызвав некую функцию, нужно что бы интерфейс не зависал и была показана какая то видимость работы, прогрэссбар не подходит по причине что я незнаю заранее чему равно 100% работы...

как решение была выбрана работа с потоками и вывод информации в статус бар, можно бы ло бы просто создавать поток и делать всю работу в нем но дело в том что расчетов (функций) как минимум 3-4 варианта и для каждого из них описывать свой поток как мне кажется не совсем читабельно, используя выше приведенный подход можно вызывать только требуемые режимы расчета (функции) при этом поток всегда один, а вызывать несколько расчетов сразу мне ненужно
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Декабрь 24, 2009, 14:09 »

а как тогда делать правильно, какой должен быть подход ?
Правильный подход в исходном примере. Смысл простой: не смешивать расчеты с UI, выделить все расчеты в отдельные классы (а лучше в отдельный файл(ы)). Сделать промежуточное звено (в примере это TransactionThread) которое обеспечивает взаимодействие "расчеты - UI". На первый взгляд это может показаться заумным и.т.п. но когда в один прекрасный день Вы услышите "нужна версия программы с командной строкой" - придется пожалеть о содеянном   Улыбающийся

как решение была выбрана работа с потоками и вывод информации в статус бар, можно бы ло бы просто создавать поток и делать всю работу в нем но дело в том что расчетов (функций) как минимум 3-4 варианта и для каждого из них описывать свой поток как мне кажется не совсем читабельно, используя выше приведенный подход можно вызывать только требуемые режимы расчета (функции) при этом поток всегда один, а вызывать несколько расчетов сразу мне ненужно
У Вас в примере показано как Улыбающийся Класс Run порождается от Transaction. Пусть Run - это "расчет 1". Делаете еще классы порожденные от Transaction, напр. Run2, Run3 (расчет 2, расчет 3) для каждого делаете виртуальный метод где выполняются сами расчеты (у Вас это apply) - и одна и та же TransactionThread работает со любыми расчетами, хотите по очереди, хотите вперемежку - зависит от того какие Transaction Вы кладете в очередь.
Записан
AntonUfo
Гость
« Ответ #18 : Декабрь 24, 2009, 16:29 »

Правильный подход в исходном примере. Смысл простой: не смешивать расчеты с UI, выделить все расчеты в отдельные классы (а лучше в отдельный файл(ы)). Сделать промежуточное звено (в примере это TransactionThread) которое обеспечивает взаимодействие "расчеты - UI". На первый взгляд это может показаться заумным и.т.п. но когда в один прекрасный день Вы услышите "нужна версия программы с командной строкой" - придется пожалеть о содеянном   Улыбающийся
[/quote]

еще один глупый вопрос Грустный, долгий расчет записан в отдельный файл formula.cpp, соответственно при необходимости расчета вызывается функция int formula(int param), как предоставить возможность функции formula посылать сигнал (emit changedStatus(QString) ), я же его объявил в классе Run...   ?
« Последнее редактирование: Декабрь 24, 2009, 16:31 от AntonUfo » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Декабрь 24, 2009, 16:50 »

еще один глупый вопрос Грустный, долгий расчет записан в отдельный файл formula.cpp, соответственно при необходимости расчета вызывается функция int formula(int param), как предоставить возможность функции formula посылать сигнал (emit changedStatus(QString) ), я же его объявил в классе Run...   ?
Run у Вас кто? Расчетная часть, вот пусть она и занимается расчетами, а не посылкой сигналов. Поэтому место класса Run в файлах formula.h и formula.cpp. И формула должна вычисляться в одном из методов Run.

Если расчет короткий то достаточно что TransactionThread сама обновит UI. Если же длинный (2 сек и больше) и разбить его на части неудобно - тогда через прокладочку (см. интерфейс CProgressShow в ishodniki2.zip). В любом случае formula.h и formula.cpp ничего не должны знать о QtGUI, сигналах и.т.п.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.