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 中的外部对象?的主要内容,如果未能解决你的问题,请参考以下文章