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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сообщение из потока  (Прочитано 4041 раз)
bsf
Гость
« : Январь 24, 2013, 15:40 »

Ребят, сразу скажу я новичок в области многопоточности и Qt. Есть простая задача, а решить не получается до конца. Пишу сокращённый участок кода классов.
Есть Import - класс, в котором решается определённая логика при работе с БД и выдаются постоянные сообщения через сигнал message.

Код
C++ (Qt)
class Import : public QObject
{
Q_OBJECT
public:
   explicit Import(QObject *parent = 0);
   ~Import();
 
public slots:
   void conv(const QString & cod)
   {
        emit message(tr("Start..."));
        loadChild(cod);
        emit message(tr("Finish..."));
   }
 
signals:
   void message(const QString &);
 
private:
   loadChild(const QString &cod)
    // рекурсия
  {
        QSqlQuery query;
        if (query.exec("....")) {
             while (query.next()) {
                  emit message(tr("Load %1").arg(cod));
                  loadChild(query.value(0).toString());
             }
        }
   }
};

Создаётся этот класс в потоке ImportThread:

Код
C++ (Qt)
class ImportThread : public QThread
{
   Q_OBJECT
public:
   ImportThread(QObject *parent = 0);
 
   void runConv(const QString &cod)
   {
         emit convSignal(cod);
   }
 
   void run()
   {
         Import *import = new Import();
         connect (import, SIGNAL(message(const QString &)), this, SIGNAL(message(const QString &)));
         connect (this, SIGNAL(convSignal(const QString &)), import, SIGNAL(conv(const QString &)));
         exec();
   }
 
signals:
    void message(const QString&);
    void convSignal(const QString &);
};

Далее в GUI стартует поток, всё как положено Вызываю runConv....выполняются в БД запросы и сыплются message на форму. Но в определённый моменты эти message перестают приходить, но при этом вся работа в БД завершается корректно. Общее количество циклов в функции loadChild - около 2000. Количество присланных message около 1300. Почему так происходит? Ткните носом и скажите, что не так! Спасибо!

Записан
Bepec
Гость
« Ответ #1 : Январь 24, 2013, 15:50 »

Я б посоветовал посмотреть выхлоп компилятора. А так же его предупреждения, если они есть.

PS код нормальный на первый взгляд, особо глубоко не всматривался.
Записан
bsf
Гость
« Ответ #2 : Январь 24, 2013, 15:53 »

Warning-ов нет, в консоль ничего лишнего не сыпется... Компилятор mingw, Qt 4.6.
P.S. пробовал писать не только на форму, но и в консоль, файл...такая же байда... Что то с потоком не то, не могу понять что!
« Последнее редактирование: Январь 24, 2013, 15:55 от bsf » Записан
Bepec
Гость
« Ответ #3 : Январь 24, 2013, 15:54 »

Минимально компиляберный проект в студию и я тогда посмотрю сегодня. (через часа 2 где то)

Записан
bsf
Гость
« Ответ #4 : Январь 24, 2013, 15:57 »

Минимально компиляберный проект в студию и я тогда посмотрю сегодня. (через часа 2 где то)
Bepec, спасибо за Ваше внимание. Но мне примерно столько же времени нужно, чтобы привести его (код) к такому же виду... Там ещё БД есть, которую так просто не отцепишь...со значениями!
Записан
rudireg
Гость
« Ответ #5 : Февраль 20, 2013, 11:35 »

Может это
Цитировать
connect (this, SIGNAL(convSignal(const QString &)), import, SIGNAL(conv(const QString &)));

надо заменить на это?
Цитировать
connect (this, SIGNAL(convSignal(const QString &)), import, SLOT(conv(const QString &)));
Записан
Bepec
Гость
« Ответ #6 : Февраль 20, 2013, 12:06 »

Как думаете, у меня велосипед не едет. Мб заменить деталь №5 в его конструкции на деталь №12 из дополнительного ремкомплекта?

PS вы уже потратили больше 2 часов на непонятную фигню.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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