Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Qt потоки синхронизация.

307
09 января 2010 года
Artem_3A
863 / / 11.04.2008
Уважаемые форумчане, возникла острая потребность синхронизировать потоки следующим образом: родительский поток запускает некоторое количество дочерних потоков после чего ожидает их завершение и обрабатывает результаты их работы. В винапи помниться была старая добрая функция WaitForMultipleObjects, в линапи объект синхронизации - барьер, а вот в Qt ничего подходящего я так и не нашел. Есть правда QWaitCondition... Но для данной задачи все равно придется извращаться. Есть ли какое нить стандартное средство решить мою задачу, а то как то не очень хочется реализовывать класс барьера ручками через мьютекс?
1.9K
10 января 2010 года
GreenRiver
451 / / 20.07.2008
Я знаком с Qt всего пару недель, но рискну предложить такой банальный вариант:
 
Код:
void ParentThread::run()
{
      childThreadA.start();
      childThreadB.start();

      childThreadA.wait();
      childThreadB.wait();
}
307
10 января 2010 года
Artem_3A
863 / / 11.04.2008
Данным кодом вы создали два потока, а затем просто заставили их ждать ULONG_MAX секунд, родительский поток при этом продолжит выполняться.
1.9K
10 января 2010 года
GreenRiver
451 / / 20.07.2008
Цитата: Artem_3A
Данным кодом вы создали два потока, а затем просто заставили их ждать ULONG_MAX секунд, родительский поток при этом продолжит выполняться.


В смысле продолжится?
[QUOTE=http://doc.trolltech.com/3.3/qthread.html#wait]

bool QThread::wait ( unsigned long time = ULONG_MAX )
A thread calling this function will block until either of these conditions is met:

  • The thread associated with this QThread object has finished execution (i.e. when it returns from run()). This function will return TRUE if the thread has finished. It also returns TRUE if the thread has not been started yet.
  • time milliseconds has elapsed. If time is ULONG_MAX (the default), then the wait will never timeout (the thread must return from run()). This function will return FALSE if the wait timed out.
[/QUOTE]

А ULONG_MAX это порядка 50 дней... если я правильно пользовался калькулятором...
К тому же судя по документации, это значение означает что никакого отсчета не будет, дочерний поток обязан вернуться из run.
1
10 января 2010 года
kot_
7.3K / / 20.01.2000
Цитата: GreenRiver

А ULONG_MAX это порядка 50 дней


хоть 100 дней - никакого отношения к синхронизации это не имеет. Учитесь пользовать инструменты по назначению.
Во первых - можно использовать QApplication::processEvents
Во вторых QProcessDialog
В третьих - hasPendingEvents
Ну и естественно использование потокобезопасных классов и т.п. например QMutex.

1.9K
10 января 2010 года
GreenRiver
451 / / 20.07.2008
Цитата: kot_
хоть 100 дней - никакого отношения к синхронизации это не имеет. Учитесь пользовать инструменты по назначению.
Во первых - можно использовать QApplication::processEvents
Во вторых QProcessDialog
В третьих - hasPendingEvents
Ну и естественно использование потокобезопасных классов и т.п. например QMutex.


А вы вообще читали, что нужно топик-стартеру?

Цитата: Artem_3A
родительский поток запускает некоторое количество дочерних потоков после чего ожидает их завершение и обрабатывает результаты их работы

1
10 января 2010 года
kot_
7.3K / / 20.01.2000
Цитата: GreenRiver
А вы вообще читали, что нужно топик-стартеру?


Я читать умею. Поэтому и написал о том, что быдлокодерством заниматься не обязательно.

1.9K
10 января 2010 года
GreenRiver
451 / / 20.07.2008
Цитата: kot_
Я читать умею. Поэтому и написал о том, что быдлокодерством заниматься не обязательно.



Предложите свой вариант.
И в чем кстати быдлокодерство в моем? Инетересно исключительно в целях повышения образованности.

307
10 января 2010 года
Artem_3A
863 / / 11.04.2008
GreenRiver, действительно просмотрел, впредь буду курить документацию внимательней.

Код:
#ifndef CTHREAD_H
#define CTHREAD_H

#include <QtDebug>
#include <QThread>

class CThread : public QThread
{
    Q_OBJECT
public:
    CThread()
    {}
    void setTime(int t)
    {   time = t;}
protected:
    void run(void)
    {
        sleep(time);
        qDebug() << "Close thread.\n";
    }
private:
    int time;
};

#endif // CTHREAD_H


Код:
#include <QtCore/QCoreApplication>
#include "CThread.h"
#include <stdlib.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    CThread threads[5];
    for(int i(0); i<5; i++) threads.setTime(i*rand()%10);
    qDebug() << "Start threads.\n";
    for(int i=0; i<5; i++) threads.start();
    for(int i=0; i<5; i++) threads.wait();
    qDebug() << "Threads finished.\n";
    system("pause");
    return a.exec();
}




Спасибо за хелп!
5
10 января 2010 года
hardcase
4.5K / / 09.08.2005
Чисто из интереса, а на OpenMP разве нельзя решить, чтобы руками не создавать потоки.
1.9K
10 января 2010 года
GreenRiver
451 / / 20.07.2008
Цитата: hardcase
Чисто из интереса, а на OpenMP разве нельзя решить, чтобы руками не создавать потоки.


Можно наверное ) В Qt кстати есть свои высокоуровневые средства распаралеливания (QtConcurrent).

307
11 января 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: hardcase
Чисто из интереса, а на OpenMP разве нельзя решить, чтобы руками не создавать потоки.



если честно не очень люблю OpenMP за громоздкость кода, обилие директив и переменных окружения тяжеловато для восприятия и чтения.

Цитата: GreenRiver
Можно наверное ) В Qt кстати есть свои высокоуровневые средства распараллеливания (QtConcurrent).



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

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог