crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

7 страниц V  « < 2 3 4 5 6 > »   
Ответить в данную темуНачать новую тему
> Как понять что программа работает в двух потоках?
RazrFalcon
  опции профиля:
сообщение 14.10.2010, 20:48
Сообщение #31


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата(igor_bogomolov @ 14.10.2010, 20:38) *
RazrFalcon, ты бы документацию читал, там все подробно описано

http://www.doc.crossplatform.ru/qt/4.6.x/qthread.html и тд.
Читаю, если б понимал - не спрашивал бы :unsure:
Цитата(igor_bogomolov @ 14.10.2010, 20:38) *
Здесь функция run2 всегда будет вызываться в основном потоке.

в том то и дело, что я не пойму как создать отличную от основной функцию/поток.
Мне надо создать 2-а разных потока! Или один, но с возможностью передачи параметров.
У меня после изменения функции run все рушится постоянно.

Все. Разобрался! Сейчас дошлифую и выложу рабочий вариант, на всякий случай. Правда не пойму почему прога не завершается сама, все делает нужное, а потом просто висит.

Сообщение отредактировал RazrFalcon - 14.10.2010, 20:55
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 18.10.2010, 19:28
Сообщение #32


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Опять в один поток идет все!
Раскрывающийся текст
#include <QtCore/QCoreApplication>
#include <QProcess>
#include <QtDebug>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv/cxcore.h>
#include <sys/time.h>
#include <QThread>

using namespace cv;

timeval start, stop;

const char* cascade_name ="/media/data/Additional/cv/haarcascades/haarcascade_frontalface_alt2.xml";
CvPoint pt1, pt2;

class MyThread : public QThread
{
public:
     void run( IplImage* img);
};

class MyThread2 : public QThread
{
public:
     void run( IplImage* img);
};

IplImage* frame;

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

    cvNamedWindow("Face detection", CV_WINDOW_AUTOSIZE);
    int stops=0;

    CvCapture* capture = cvCreateCameraCapture(0);

    MyThread th;
    MyThread2 th2;
    while(stops!=1)
    {
        frame = cvQueryFrame(capture);
        //th.start();
        th.run(frame);
        cvShowImage("Face detection", frame);
        //th.exit();
        cvWaitKey(15);
        //th2.start();
        th2.run(frame);
        cvShowImage("Face detection", frame);
        cvWaitKey(15);
        
   }
    cvReleaseCapture(&capture);
    cvDestroyWindow("Face detection");

    return a.exec();
}

void MyThread::run( IplImage* img)
{
    обработка
    return;
}

void MyThread2::run( IplImage* img)
{
   обработка
   return;
}


Сообщение отредактировал RazrFalcon - 18.10.2010, 19:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.10.2010, 20:07
Сообщение #33


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(RazrFalcon @ 18.10.2010, 22:28) *
Опять в один поток идет все!

а в чём это выражается ?


А это шо за хрень неведомая
    while(stops!=1)
    {
...
        //th.start();
        th.run(frame);
...
        //th2.start();
        th2.run(frame);
   }


так всё правильно: потоки ты не запустил (//start) , а метод run вызываешь из одного потока (главного). Вот и один поток

Сообщение отредактировал Алексей1153 - 18.10.2010, 20:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 18.10.2010, 20:14
Сообщение #34


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


В том то и проблема.
Если использовать start - то 2-а потока еще добавляю, но я не могу функции run() послать переменную.
А если через run - то все в один поток, но зато я могу передать свои значения.
Как это правильно сделать?
PS выражается в том что загружено только одно ядро. :huh:

Еще одну ошибку нашел.
Запустил дебаг, а оно пошло создавать потоки, когда было >100 я остановил прогу.
То есть их нужно закрывать еще =(
Я тут повешусь с этими потоками.

Сообщение отредактировал RazrFalcon - 18.10.2010, 20:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.10.2010, 20:23
Сообщение #35


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


RazrFalcon, пипец...

конечно же, если в цикле вызывать start, будет много потоков. И для них 100 ядер не надо, чтобы это определить )))

Параметры передай через члены классов MyThread и MyThread2
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 18.10.2010, 20:28
Сообщение #36


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Цитата(Алексей1153 @ 18.10.2010, 20:23) *
Параметры передай через члены классов MyThread и MyThread2

? Не понял. Как передать то?

То есть мне надо сами циклы в run() уже делать?
Создаю два потока, а они оба с while.
Я правильно понял.
PS извиняюсь за тупость, но я вторую неделю мучаю эти потоки, и пока просветления никакого.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.10.2010, 20:39
Сообщение #37


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


вот смотри, наглядно то, что ты сделал - с одним потоком:
Прикрепленное изображение


а вот, когда действительно 3 потока
Прикрепленное изображение


Цитата(RazrFalcon @ 18.10.2010, 23:28) *
? Не понял. Как передать то?



вот так
class MyThread
{
     int Превеед_я_член_класса_приятно_познакомиться;

...

};


Сообщение отредактировал Алексей1153 - 18.10.2010, 20:39
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 18.10.2010, 20:47
Сообщение #38


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


:lol:
Логика работы потоков мне ясна, я не понимаю тока реализацию саму.
Мне нужно:
взять изображение с камеры
обработать
отобразить обработанное.
В потоках только обработка. А захват и отображение main.
Как передать захвачено изображение потоку?
Это вообще логично/возможно для двух ядер?

Сообщение отредактировал RazrFalcon - 18.10.2010, 20:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.10.2010, 21:01
Сообщение #39


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(RazrFalcon @ 18.10.2010, 23:47) *
Логика работы потоков мне ясна, я не понимаю тока реализацию саму


неа, не ясна тебе работа потоков. Поток - это процедура (голая такая процедура, и НИЧЕГО БОЛЬШЕ ВООБЩЕ) - статическая или глобальная. Только запускается эта процедура системой, а не вызывается как обычно из кода одного из потоков (в последнем случае нить, проходящая через процедуру не являет собой нового потока - смотри первый рисунок)

Под WINAPI объявление потока выглядит так:
UINT thread(LPVOID param)
{
  //цикл работы
  //...

  return 0;
}


При чём тут ядра? Где тут ядра? Забудь про ядра!


я бы так сделал:
1) первый поток - захват, помещение в очередь обработки
2) второй поток - извлечение из очереди обработки, обработка, отправка в БД/ОЗУ/файл
3) основной поток - отображение из БД/ОЗУ/файла

чтение/запись надо синхронизировать - тут наблюдается две таких точки (запись в очередь/извлечение из очереди , запись в хранилище/извлечение из хранилища)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 18.10.2010, 22:11
Сообщение #40


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Мне нужна многопоточность, только для ускорения работы, а такой алгоритм, как вы написали, не очень то похож на высокопроизводительный.
Вот если бы оно в два пото обрабатывало, это мне понятно, а просто раскидать по потокам :huh:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

7 страниц V  « < 2 3 4 5 6 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.1.2025, 14:33