Russian Qt Forum
Ноябрь 22, 2024, 21:38 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Вопрос ламера о реализации многопоточности  (Прочитано 23171 раз)
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #15 : Декабрь 09, 2016, 12:54 »

Опять ты неверно мыслишь. Улыбающийся У тебя таймер не будет срабатывать, ибо нет обработки очереди сообщений. Тебе нужно явно кидать сигнал внутри while.
QCoreApplication::instance()->processEvents() внутри while спасло отца русской демократии  Смеющийся
Это плохой ход, поэтому я тебе и не говорил про него.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Hvzh
Гость
« Ответ #16 : Декабрь 09, 2016, 13:43 »

Опять ты неверно мыслишь. Улыбающийся У тебя таймер не будет срабатывать, ибо нет обработки очереди сообщений. Тебе нужно явно кидать сигнал внутри while.
QCoreApplication::instance()->processEvents() внутри while спасло отца русской демократии  Смеющийся
Это плохой ход, поэтому я тебе и не говорил про него.
Хорошо, можешь пример набросать, как мне раз в минуту данные отправлять?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #17 : Декабрь 09, 2016, 13:48 »

Псевдокот.

Код
C++ (Qt)
QTime time;
time.start();
while (1) {
 //some
 if (time.esapsed () > ???) {
   emit newDataAvailable();
   time.start();
}
}
 
« Последнее редактирование: Декабрь 09, 2016, 14:02 от Пантер » Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Hvzh
Гость
« Ответ #18 : Декабрь 09, 2016, 14:04 »

Ok, сейчас попробую
Записан
Hvzh
Гость
« Ответ #19 : Декабрь 09, 2016, 14:13 »

Псевдокот.

Код
C++ (Qt)
QTime time;
time.start();
while (1) {
 //some
 if (time.esapsed () > ???) {
   emit newDataAvailable();
   time.start();
}
}
 
Спасибо, работает. Правда, в if заменил time.start на time.restart
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #20 : Декабрь 09, 2016, 14:33 »

Это был псевдокот, писал по памяти. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Декабрь 09, 2016, 15:02 »

Псевдокот.

Код
C++ (Qt)
QTime time;
time.start();
while (1) {
 //some
 if (time.esapsed () > ???) {
   emit newDataAvailable();
   time.start();
}
}
 
Цитировать
Уж больно ты щедрый, председатель, на колхозное добро
(классика советского кино)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #22 : Декабрь 09, 2016, 15:20 »

Псевдокот.

А что не QTimer?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #23 : Декабрь 09, 2016, 15:22 »

Вот докопались, я вообще в данный момент на пыхе пишу.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #24 : Декабрь 09, 2016, 15:37 »

Оно и видно Смеющийся
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #25 : Декабрь 09, 2016, 15:38 »

Не надо смеяться над вынужнденным пыхером. Грустный
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Hvzh
Гость
« Ответ #26 : Декабрь 14, 2016, 12:53 »

Еще раз прошу помощи! Опять возникла проблема с сигналами. Я создаю потоки следующим образом:

Код:
    dbthread = new QThread;
    impthread = new QThread;

    worker = new DbWriteWorker();
    worker->setInterval(60);

    impworker = new ImageProcessingWorker(0, QString::fromUtf8(startx).toInt(), QString::fromUtf8(starty).toInt(),
                                          QString::fromUtf8(endx).toInt(), QString::fromUtf8(endy).toInt(),
                                          QString::fromUtf8(minArea).toInt(), QString::fromUtf8(maxArea).toInt(), 1, QString::fromUtf8(url));
    // Соединяем сигнал started потока, со слотом process "рабочего" класса, т.е. начинается выполнение нужной работы.
    connect(dbthread, SIGNAL(started()), worker, SLOT(process()));
    connect(impthread, SIGNAL(started()), impworker, SLOT(process()));

    // По завершению выходим из потока, и удаляем рабочий класс
    connect(worker, SIGNAL(finished()), dbthread, SLOT(quit()));
    connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
    connect(impworker, SIGNAL(finished()), impthread, SLOT(quit()));
    connect(impworker, SIGNAL(finished()), impworker, SLOT(deleteLater()));

    // Удаляем поток, после выполнения операции
    connect(dbthread, SIGNAL(finished()), dbthread, SLOT(deleteLater()));
    connect(impthread, SIGNAL(finished()), impthread, SLOT(deleteLater()));
    connect(impworker, SIGNAL(sendCounters(int,int, int)), worker, SLOT(waitForDB(int,int,int)));
    connect(impworker, SIGNAL(newCameraOpened(int)), this, SLOT(cameraStarted(int)));

    //connect(worker, SIGNAL(getDataSignal()), impworker, SLOT(prepareCounters()));

    worker->moveToThread(dbthread);
    impworker->moveToThread(impthread);
    dbthread->start();
    impthread->start();

Строка
Код:
 connect(impworker, SIGNAL(newCameraOpened(int)), this, SLOT(cameraStarted(int)));
служит для получения ID видеопотока, чтобы использовать его для запроса данных из базы, а также для его закрытия.

В потоке посылается сигнал:
Код:
void ImageProcessingWorker::process()
{

    qDebug() << "ImageProcessingWorker::process source = " << strSource;

    bool isRead = 0;
    cv::Mat imgFrame1;
    cv::Mat imgFrame2;
    cv::Mat imgFrame2Copy;

    blnFirstFrame = true;

    int frameCount = 2;
    try
    {
        capture.open(strSource.toStdString().c_str());
    }
    catch(cv::Exception& e)
    {
        std::cerr << "Exception was catched!" << std::endl;
        cameraID = -1;
        emit newCameraOpened(cameraID);
        return;
    }

    if(!capture.isOpened()){
      std::cerr << "Cannot open camera!" << std::endl;
      cameraID = -1;
      emit newCameraOpened(cameraID);
      return;
    }
    else
    {
        isRead = capture.read(imgFrame1);
        imageSize.height = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
        imageSize.width = capture.get(CV_CAP_PROP_FRAME_WIDTH);
        fps = 25;

        cameraID = createNewDbLine();
        emit newCameraOpened(cameraID);
        if(cameraID == -1)
            return;

        QString fName = QString::number(cameraID) + ".avi";
        if(!writer.open(fName.toStdString().c_str(), CV_FOURCC('F', 'M', 'P', '4'), fps, imageSize))
        {
            std::cerr << "Cannot write video!" << std::endl;
            capture.release();
            cameraID = -1;
            return;
        }
    }
,
однако в пункт назначения сигнал не приходит. И вообще непонятно, уходит ли...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #27 : Декабрь 14, 2016, 13:17 »

Добавь вывод qDebug ()  в месте выдачи сигнала и в слоте.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Hvzh
Гость
« Ответ #28 : Декабрь 14, 2016, 13:25 »

В слоте есть, также qDebug есть в createNewDbLine, то есть, перед сигналом. В слоте ничего не выводится, с createNewDbLine все нормально
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #29 : Декабрь 14, 2016, 13:37 »

Есть варианты:
1. У тебя источник и приемник получаются в одном потоке и этот поток занят.
2. Поток приемника занят.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 23.