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

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

Страниц: 1 ... 3 4 [5]   Вниз
  Печать  
Автор Тема: Процесс внутри потока?  (Прочитано 31281 раз)
mutineer
Гость
« Ответ #60 : Март 12, 2012, 23:43 »

Значит нужно выносить рабочую часть из наследника QThread в отдельный класс и мувать его в обычный QThread

http://habrahabr.ru/blogs/qt_software/115830/
http://habrahabr.ru/blogs/qt_software/115835/
http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/
« Последнее редактирование: Март 12, 2012, 23:45 от mutineer » Записан
V1KT0P
Гость
« Ответ #61 : Март 12, 2012, 23:53 »

Значит нужно выносить рабочую часть из наследника QThread в отдельный класс и мувать его в обычный QThread

http://habrahabr.ru/blogs/qt_software/115830/
http://habrahabr.ru/blogs/qt_software/115835/
http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/
Согласен, но как временное решение мувать самого в себя подойдет. Вот еще бы пример в справке показывал бы как надо правильно делать. Ибо я думаю многие об это спотыкаются.
Записан
mutineer
Гость
« Ответ #62 : Март 13, 2012, 00:07 »

Значит нужно выносить рабочую часть из наследника QThread в отдельный класс и мувать его в обычный QThread

http://habrahabr.ru/blogs/qt_software/115830/
http://habrahabr.ru/blogs/qt_software/115835/
http://labs.qt.nokia.com/2010/06/17/youre-doing-it-wrong/
Согласен, но как временное решение мувать самого в себя подойдет. Вот еще бы пример в справке показывал бы как надо правильно делать. Ибо я думаю многие об это спотыкаются.

"Нет ничего более постоянного, чем временное" - очень правильная поговорка, так что даже как временное я бы не делал. Ведь вынести все из одного класса в другой очень несложно
Записан
mutineer
Гость
« Ответ #63 : Март 13, 2012, 00:11 »

Сделал слот отдельный для приёма, работает, но всё дико тормозит, включая итерфейс. Почему такое может быть?

потому что sleep() вызвается в главном потоке ибо объект-наследник QThread живет в главном потоке и его слоты работают в нем (при автоконнекте). соответсвенно тормозишь ты главный поток

как вариант может помочь такое (если я правильно понял код):
Код:
connect(iplistIterator, SIGNAL(nextPlease(const QString &)), this, SLOT(checkRequest(const QString &)), Qt::DirectConnection);
« Последнее редактирование: Март 13, 2012, 00:16 от mutineer » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #64 : Март 13, 2012, 12:40 »

И, как я понимаю, если не удалять процесс, то будет утечка памяти, но почему всё же крашится, если удалять?
Не мешает посмотреть что пишет консоль. И вообще попечатать QThread::currentThreadId (где кто выполняется). Обычно выясняется много интересного

Опять прошу более опытных товарищей воздержаться от поучений и отправок в гугл/книгу,
Трудно воздержаться от назидательных фраз Улыбающийся  Товарищи говорили - чем меньше логики в нитке - тем лучше. Но Вы опять втулили итератор в нитку. Результат

void IplistIterator::finalize(bool result)
{
   /* Заморочки с базой и.т.п. будут здесь */
   if(result) (**iterator)->setText(1, "OK!");
   else (**iterator)->setText(1, "FAIL Грустный");
А из какой нитки Вы дергаете UI? (можно только из главной)
Записан
chron1c
Гость
« Ответ #65 : Март 20, 2012, 09:16 »

С задачей разобрался, процесс перестал создавать/удалять, использую ->kill(), а потом ->start() для другого IP.
Решил вообще не использовать поток отдельный, а проверять айпи и переходить к следующему по timeOut у QTimer'а.
Спасибо всем за помощь Улыбающийся

Возникла другая проблема теперь, но отдельную тему создавать не хочется для этого.
В классах своих создавал графические элементы динамически, а сейчас переделал и создал .ui для каждого класса.
По каким-то причинам не работает show() с объектом класса, для которого задан .ui.
Нужно внутри класса, из слота его, вызывать show(), пробовал и open() и this->show()/open(), даже извне пробовал show() вызывать - всё равно не отображается.
В чём может быть причина? В гугле ничего найти не удалось.

Сам объект(хотя так во всех объектах, переделанных с помощью добавления GUI-класса).
Код:
// ========== h
class ipSetWindow : public QDialog
{
Q_OBJECT

public:
ipSetWindow(bool gateway = false, QWidget *parent = 0);
~ipSetWindow();
public slots:
void modifyItem(QTreeWidgetItem *item, int column = 0);
private slots:
void sendIP();
void sendName();
void closeDialog();
private:
bool validate(QString &text); //Удаляет лишние нули и проверяет правильность айпишника (1-255.0-255.0-255.0-255), возвращает true, если всё ОК
QString *adress;
QTreeWidgetItem *pItem;
Ui::ipSetWindow ui;
};
//========== cpp
ipSetWindow::ipSetWindow(bool gateway, QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
pItem = 0;
adress = new QString;
ui.ipEdit->setInputMask("000.000.000.000;_");
ui.nameEdit->hide();
ui.okButton->hide();

connect(ui.nextButton, SIGNAL(clicked()), this, SLOT(sendIP()));
connect(ui.closeButton, SIGNAL(clicked()), this, SLOT(closeDialog()));
connect(ui.okButton,SIGNAL(clicked()), this, SLOT(sendName()));

setFixedSize(sizeHint());
}

ipSetWindow::~ipSetWindow()
{
delete adress;
}

void ipSetWindow::closeDialog()
{
ui.ipEdit->clear();
ui.nameEdit->clear();
pItem = 0;
close();
}

void ipSetWindow::modifyItem(QTreeWidgetItem *item, int column)
{
ui.ipEdit->setText(item->text(0));
ui.nameEdit->setText(item->text(1));
pItem = item;
show();
}

Записан
Страниц: 1 ... 3 4 [5]   Вверх
  Печать  
 
Перейти в:  


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