Size: a a a

2020 January 31

M

Mr.Mait in Qt
Xio
Как это сделать, что надо гуглить?
QMetaObject::invokeMethod(QObject *context, [=](){
// тут любой код или вызов метода
   }, Qt::QueuedConnection);
источник

SE

Suigintou45 E13 in Qt
If context is destroyed before the interval occurs, the method will not be called. The function will be run in the thread of context. The context's thread must have a running Qt event loop.
источник

M

Mr.Mait in Qt
Mr.Mait
QMetaObject::invokeMethod(QObject *context, [=](){
// тут любой код или вызов метода
   }, Qt::QueuedConnection);
Только я вот не помню, нужен ли
Qt::QueuedConnection
источник

SE

Suigintou45 E13 in Qt
Mr.Mait
Только я вот не помню, нужен ли
Qt::QueuedConnection
вроде нужен
источник

M

Mr.Mait in Qt
Изменил выше
источник

AT

Anatoly Tomilov in Qt
встречал ли кто-нибудь плагин QImageWriter для OpenEXR?
источник

X

Xio in Qt
Mr.Mait
QMetaObject::invokeMethod(QObject *context, [=](){
// тут любой код или вызов метода
   }, Qt::QueuedConnection);
На QObject *context ругается, туда что-то другое нужно передать?
источник

X

Xio in Qt
хидеры заинкулудил
источник

AT

Anatoly Tomilov in Qt
Xio
На QObject *context ругается, туда что-то другое нужно передать?
Тебе надо указатель на объект, чей метод хочешь вызвать, передать
источник

M

Mr.Mait in Qt
Не обязательно, можно указатель на объект, который находится в гуи потока, если не ошибаюсь. Делал такое очень давно
источник

AT

Anatoly Tomilov in Qt
Mr.Mait
Не обязательно, можно указатель на объект, который находится в гуи потока, если не ошибаюсь. Делал такое очень давно
А метод чей вызовется? Того объекта, который ты держишь в уме? Это волшебство какое-то в таком случае
источник

M

Mr.Mait in Qt
Пример
#include <QApplication>

void funcTest()
{
   qDebug() << "in gui thread: " << QThread::currentThread();
}

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);

   QObject *context = new QObject;

   QtConcurrent::run([=]{
       qDebug() << "In another thread: " << QThread::currentThread();
       QMetaObject::invokeMethod(context, [=](){
           funcTest();
           }, Qt::QueuedConnection);
   });

   return a.exec();
}
источник

PM

Peter Mironychev in Qt
Mr.Mait
Пример
#include <QApplication>

void funcTest()
{
   qDebug() << "in gui thread: " << QThread::currentThread();
}

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);

   QObject *context = new QObject;

   QtConcurrent::run([=]{
       qDebug() << "In another thread: " << QThread::currentThread();
       QMetaObject::invokeMethod(context, [=](){
           funcTest();
           }, Qt::QueuedConnection);
   });

   return a.exec();
}
здесь разве контекст в другом потоке?
источник

PM

Peter Mironychev in Qt
moveToThread не надо?
источник

M

Mr.Mait in Qt
Если без QMetaObject::invokeMethod вызывать funcTest(), то вызов будет в другом потоке
источник

M

Mr.Mait in Qt
Если с QMetaObject::invokeMethod, то вызов funcTest() будет в основном потоке
источник

M

Mr.Mait in Qt
Peter Mironychev
здесь разве контекст в другом потоке?
Контекс в главном потоке. Вызов любого метода через invokeMethod будет выполняться в главном потоке
источник

SE

Suigintou45 E13 in Qt
Mr.Mait
Пример
#include <QApplication>

void funcTest()
{
   qDebug() << "in gui thread: " << QThread::currentThread();
}

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);

   QObject *context = new QObject;

   QtConcurrent::run([=]{
       qDebug() << "In another thread: " << QThread::currentThread();
       QMetaObject::invokeMethod(context, [=](){
           funcTest();
           }, Qt::QueuedConnection);
   });

   return a.exec();
}
[=] - не надо так делать)
источник

M

Mr.Mait in Qt
Если контекс будет в 3 потоке, то вызов любого метода через invokeMethod будет выполняться в 3 потоке
источник

M

Mr.Mait in Qt
Suigintou45 E13
[=] - не надо так делать)
Ну это по быстрому :)
источник