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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не вызывается метод из QMetaObject::invokeMethod  (Прочитано 3212 раз)
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 не вызывается. В консоль отладки никаких сообщений тоже нет. В чем может быть проблема ?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июль 21, 2012, 08:43 »

Так у вас же цикла обработки сообщений в этом потоке нет. Как по вашему должен Qt::QueuedConnection сработать?
Записан
wester
Гость
« Ответ #2 : Июль 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 в новом потоке. Это нормально, или надо переделать ?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Июль 21, 2012, 17:09 »

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

Задумка такая - будет очередь событий для m_db. И не нужно будет возиться с блокировкой доступа к данным внутри ins()
Хотя, конечно, вызывать напрямую метод тоже кажется лучшим выходом из ситуации
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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