2015-03-14 2 views
0

У меня есть класс потоков, который отлично работает на рабочем столе, но падает на Android. В моем приложении Qt Мне нужна задача с общим объектом:Qt Android, Как получить доступ к внешнему объекту в QRunnable?

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); 

Это работает втирает в рабочем столе. Но в андроиде, как вы знаете, это не работает. когда я запускаю его Fatal signal 11 (SIGSEGV), code 1, fault addr 0x98 in tid 31727 (Thread (pooled)) происходит, и только первый Hello распечатывает перед использованием _p
Так что мой вопрос:
Как использовать MyPointer (общий объект) во всех потоках. Я не могу передать его копию в каждый поток. Он должен быть передан указателем во всех потоках. Другими словами, как использовать общий объект во всех потоках. В методах, которые не являются константами, и каждый из потоков может изменить объект.
Я знаю, что есть несколько методов обработки многоразмерных приложений в Qt. какой из них подходит для работы на устройстве Android?
Нужно ли использовать JNI для безопасного многопоточности в Android? Думаю, да!

ответ

2

Сделайте это потокобезопасным путем обертывания доступа к вашему указателю с помощью мьютекса или семафора или чего-то еще.

Альтернативой является отправка его с использованием разъема для очередного сигнала.

Вот один из способов сделать это с помощью мьютекса:

// 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

Надежда, что помогает.

+0

Спасибо за ваш ответ. Но я тестировал приложение на рабочем столе, и он отлично работает без Mutex. Проблема - андроид. Мьютекс не устранил проблему. –

Смежные вопросы