Russian Qt Forum

Qt => Вопросы новичков => Тема начата: wester от Июль 21, 2012, 00:35



Название: Не вызывается метод из QMetaObject::invokeMethod
Отправлено: wester от Июль 21, 2012, 00:35
Доброго времени суток.

Есть класс, наследуемый от QRunnable
Код
C++ (Qt)
class DirectoryWalker : public QRunnable
{
...
DbWork *m_db;
}
в нем, в ::run()
вызывается метод ins() из DbWork
Код
C++ (Qt)
::run(){
m_db = new DbWork();
QMetaObject::invokeMethod(m_db,"ins",Qt::QueuedConnection,Q_ARG(QString,dirIt.filePath()));
}

обьявление DbWork
Код
C++ (Qt)
class DbWork : public QObject
{
Q_OBJECT
...
public slots:
  void ins(const QString& data);
}
 

ну и собственно метод ins не вызывается. В консоль отладки никаких сообщений тоже нет. В чем может быть проблема ?


Название: Re: Не вызывается метод из QMetaObject::invokeMethod
Отправлено: LisandreL от Июль 21, 2012, 08:43
Так у вас же цикла обработки сообщений в этом потоке нет. Как по вашему должен Qt::QueuedConnection сработать?


Название: Re: Не вызывается метод из QMetaObject::invokeMethod
Отправлено: wester от Июль 21, 2012, 12:20
Добавил QEventLoop. Теперь выглядит так посылка события.
Код
C++ (Qt)
QEventLoop l(m_db);
QMetaObject::invokeMethod(m_db,"ins",Qt::QueuedConnection,Q_ARG(QString,dirIt.filePath()));
l.processEvents();
Но вот получается что постоянно создается новый QEventLoop в новом потоке. Это нормально, или надо переделать ?


Название: Re: Не вызывается метод из QMetaObject::invokeMethod
Отправлено: LisandreL от Июль 21, 2012, 17:09
Но вот получается что постоянно создается новый QEventLoop в новом потоке. Это нормально, или надо переделать ?
Это непонятно зачем.
Какие по вашей задумки должны быть преимущества у этого кода по сравнению с прямым вызовом:
Код
C++ (Qt)
::run(){
m_db = new DbWork();
m_db->ins( dirIt.filePath() );
}
Ну и кроме того можно использовать QCoreApplication::processEvents();


Название: Re: Не вызывается метод из QMetaObject::invokeMethod
Отправлено: wester от Июль 21, 2012, 18:22
Задумка такая - будет очередь событий для m_db. И не нужно будет возиться с блокировкой доступа к данным внутри ins()
Хотя, конечно, вызывать напрямую метод тоже кажется лучшим выходом из ситуации