Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: bsf от Январь 24, 2013, 15:40



Название: Сообщение из потока
Отправлено: 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. Почему так происходит? Ткните носом и скажите, что не так! Спасибо!



Название: Re: Сообщение из потока
Отправлено: Bepec от Январь 24, 2013, 15:50
Я б посоветовал посмотреть выхлоп компилятора. А так же его предупреждения, если они есть.

PS код нормальный на первый взгляд, особо глубоко не всматривался.


Название: Re: Сообщение из потока
Отправлено: bsf от Январь 24, 2013, 15:53
Warning-ов нет, в консоль ничего лишнего не сыпется... Компилятор mingw, Qt 4.6.
P.S. пробовал писать не только на форму, но и в консоль, файл...такая же байда... Что то с потоком не то, не могу понять что!


Название: Re: Сообщение из потока
Отправлено: Bepec от Январь 24, 2013, 15:54
Минимально компиляберный проект в студию и я тогда посмотрю сегодня. (через часа 2 где то)



Название: Re: Сообщение из потока
Отправлено: bsf от Январь 24, 2013, 15:57
Минимально компиляберный проект в студию и я тогда посмотрю сегодня. (через часа 2 где то)
Bepec, спасибо за Ваше внимание. Но мне примерно столько же времени нужно, чтобы привести его (код) к такому же виду... Там ещё БД есть, которую так просто не отцепишь...со значениями!


Название: Re: Сообщение из потока
Отправлено: rudireg от Февраль 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 &)));


Название: Re: Сообщение из потока
Отправлено: Bepec от Февраль 20, 2013, 12:06
Как думаете, у меня велосипед не едет. Мб заменить деталь №5 в его конструкции на деталь №12 из дополнительного ремкомплекта?

PS вы уже потратили больше 2 часов на непонятную фигню.