2016-06-02 4 views
0

Рассмотрение проекта Qt. Я определил разные Qthreads для выполнения моих вычислений в timerEvent каждого класса и покажу результаты в QMainWindow. (! Класс А, В и С являются одинаковыми и только содержание printf() будет изменено)Синхронизация Qthreads на разных бесконечных циклах (QTimerEvent)

Здесь a.h

class A : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit A(QObject *parent = 0); 
    void timerEvent(QTimerEvent *); 

private: 
    int timerId; 
}; 

и A.cpp является:

A::A(QObject *parent) : 
    QObject(parent) 
{ 
    timerId = startTimer(1000); 
} 

void A::timerEvent(QTimerEvent *) 
{ 
    printf("A\n"); 
} 

main.cpp как следует:

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

    QThread thread_1, thread_2, thread_3; 

    A objA; 
    B objB; 
    C objC; 

    objA.moveToThread(&thread_1); 
    objB.moveToThread(&thread_2); 
    objC.moveToThread(&thread_3); 

    thread_1.start(); 
    thread_2.start(); 
    thread_3.start(); 

    return a.exec(); 
} 

pl легко подумайте, что я не могу изменить макет моих классов. Вопрос: Как синхронизировать мои Qthreads в этих ситуациях? Результаты каждого класса не имеют зависимостей, но я должен быть уверен, что все результаты доступны в каждую секунду и в том же порядке. Например, результаты всегда должны отображаться как A B C A B C A B C ... Спасибо!

+1

Если вам нужна последовательная обработка, вам действительно нужно использовать отдельные потоки? – TheDarkKnight

+0

«Я хочу сделать что-то еще, но я не могу изменить свой код». С таким отношением вы можете в значительной степени просто отказаться :( –

+0

@KubaOber некоторые ребята помогают, но парни, как вы, просто стонут! Я не понимаю ваш ответ. – Mogi

ответ

1

То, что вы просите, невозможно. Время выполнения кода, выполняющегося в потоках, будет меняться, поскольку ядра будут совместно использоваться остальной частью OS, и он будет меняться и как долго они будут активны. Достаточно, чтобы заказ мог измениться, и вы можете гарантировать. Большинство параллельных систем используют линейные сегменты для этой точки, например, параллельно обрабатывают все задачи, ставят результаты в очередь и завершают параллельный раздел, сортируют (например, по и id) и затем обрабатывают.

Вы можете попробовать MapReduce в QtConcurrent. Или попробуйте задания, но это будет означать, что система будет запускать C после B и B после A, делая его последовательным. Вам нужно будет подумать о том, какие ограничения для заказа вы хотите.

0

Если вы не можете изменить классы A, B и C, вы все равно можете создать класс управления, который перемещается в его поток, владеет объектами A, B и C, имеет таймер событий и по истечении тайм-аутов вызывает timerEvent() функционирует в правильном порядке.

Это имеет смысл, поскольку ожидается, что результат будет в порядке.

Если, однако, это упражнение по синхронизации потоков, вы должны обернуть эти классы в классы, которые могут выполнять некоторую синхронизацию, такую ​​как переменные условий, позволяя следующему классу знать, что текущий класс завершен.

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

  • Нет связанных вопросов^_^