Qt Android,如何访问 QRunnable 中的外部对象?

Posted

技术标签:

【中文标题】Qt Android,如何访问 QRunnable 中的外部对象?【英文标题】:Qt Android, How to access an external object in QRunnable? 【发布时间】:2015-03-14 12:06:38 【问题描述】:

我有一个线程类在桌面上运行良好,但在 android 上崩溃。在我的 Qt 应用程序中,我需要一个具有这样的共享对象的任务:

class UpdateTask : public QRunnable

    MyPointer * _p;
    void run()
    
        qDebug() << "Hello world from thread" << QThread::currentThread();
        _p.write();
        qDebug() << "Hello3 world from thread" << QThread::currentThread();
    
public:
    UpdateTask ();
    ~UpdateTask ();
    void setPointer(MyPointer * pointer)
        _p = pointer;
    
;

主要我希望能够按如下方式运行任务:

UpdateTask * task = new UpdateTask ();
task->setPointer(_pointer);
QThreadPool::globalInstance()->start(task);

这在桌面上运行良好。但是在你可能知道的android中它不起作用。当我运行它时Fatal signal 11 (SIGSEGV), code 1, fault addr 0x98 in tid 31727 (Thread (pooled)) 发生并且在使用 _p 之前只有第一个 Hello 打印 所以我的问题是: 如何在所有线程中使用 MyPointer(共享对象)。我不可能将它的副本传递给每个线程。它应该在所有线程中通过指针传递。换句话说,我如何在所有线程中使用共享对象。在非 const 方法中,每个线程都可以更改对象。 我知道有几种技术可以在 Qt 中处理多线程应用程序。哪一个适合在 android 设备上工作?我是否需要使用 JNI 在 android 中进行安全的多线程处理?我想我会的!

【问题讨论】:

【参考方案1】:

通过使用互斥锁或信号量或其他东西包装对指针的访问,使其成为线程安全的。

另一种方法是使用排队信号槽连接发送它。

这是使用互斥锁的一种方法:

// Member variable of UpdateTask
QMutex m_mutex;
// In your constructor
_p = 0;

void UpdateTask::setPointer(MyPointer *pointer)

    QMutexLocker locker(&m_mutex);
    _p = pointer;


void UpdateTask::run()

    // Create connections here, and the thread affinity will be correct, 
    // otherwise you need to use moveToThread() or explicitly say a 
    // Qt::QueuedConnection


    // Any place where _p is accessed
    
        QMutexLocker locker(&m_mutex);
        if(p != 0)
            p->write();
    

http://doc.qt.io/qt-5/qmutexlocker.html#details

希望对您有所帮助。

【讨论】:

感谢您的回答。但是我在桌面上测试了这个应用程序,没有 Mutex 也能很好地工作。问题是安卓。互斥锁没有解决问题。

以上是关于Qt Android,如何访问 QRunnable 中的外部对象?的主要内容,如果未能解决你的问题,请参考以下文章

C++11消息队列 + Qt线程池 + QRunnable执行任务简单模型

无法写入 QRunnable 内的 QTcpSocket

停止 QRunnable 导致主窗口无法关闭

如何杀死 PyQt5 中的 QRunnable?

Qt - 一个简单的回显服务器

PyQt5如何多个QRunnable报告进度和最终结果