crossplatform.ru

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

7 страниц V  < 1 2 3 4 5 > »   
Ответить в данную темуНачать новую тему
> Как понять что программа работает в двух потоках?
RazrFalcon
  опции профиля:
сообщение 12.10.2010, 14:38
Сообщение #21


Zombie Mod
*****

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

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




Репутация:   212  


Цитата(Алексей1153 @ 12.10.2010, 6:18) *
Мне только осталось неясно, почему лог так быстро закончился

Лог от последнего примера, там до 10 как раз и есть.
Цитата(Алексей1153 @ 12.10.2010, 6:18) *
они оба выдают "+two". внимательнее надо писать код

Да уш, закрутился называется. :rolleyes:
Но суть в том что я не пойму как заставить разные функции выполнятся.
Сейчас я создаю 2-а (3-и с основным) потока, которые делают одно и тоже.
А мне надо чтоб один поток делал одно, а второй другое. Хотя в принципе можно также чтоб одно и тоже действие но с разными параметрами.
И вопрос в том: если я создаю еще 2-а исполняющих потока - то основной (main) в простое просто. И как можно дать приоритет main'у. Я то только новым задаю приоритет потокам. К слову, он вообще сильно влияет. Я пока что особой разницы не заметел, хотя у мне я то и функция не ахти =).
Что б было понятно что за ересь я написал выше, такой вот пример:
Есть захват видео с камеры, грубо говоря покадрово. То есть я беру 1-й кадр - его в потока пусть обрабатывается, и пока он обрабатывается беру следующий, и его во второй поток. Потом первый обработался - вывели на экран, и первый берет уже 3-й кадр ну и тд. Главное чтоб они выводились во время а не как попало (1,2,3,4,5... а не 1,3,2,5,4 к примеру). Ну и соответственно сколько ядер, столько и обрабатывается кадров одновременно, это на будущие конечно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 12.10.2010, 15:11
Сообщение #22


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

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


Цитата(RazrFalcon @ 12.10.2010, 17:38) *
Главное чтоб они выводились во время а не как попало (1,2,3,4,5... а не 1,3,2,5,4 к примеру)

присваиваешь потокам "номера" и гоняешь циклический счётчик. каждый раз ждёшь ответа о готовности обработки кадра от потока с номером по счётчику и увеличиваешь счётчик (циклически). иначе ты не добьёшься синхронизации просто никак. процессоры могут быть нагружены другими задачами, система может использовать их для обработки прерываний и т.п., поэтому никогда нельзя гарантировать скорость обработки, даже при высоком приоритете.
в обычной (не embedded) венде высокий приоритет процесса вообще ничего не значит, практически. при активной работе сетевой карты задержки обработки "риал-тайм" прерываний от чего угодно могут доходить до 200 мс, как два пальца об асфальт. и это на уровне драйвера! а софт вообще курит бамбук и на настоящий риалтайм надеяться никак не может.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 12.10.2010, 15:29
Сообщение #23


Zombie Mod
*****

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

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




Репутация:   212  


Так все и выясняется. Ну в общем ясно. Буду пробовать.
_________________________________________________

cpp
class MyThread : public QThread
{
public:
     void run(int i);
};

class MyThread2 : public QThread
{
public:
     void run2(int i);
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyThread th;
    MyThread2 th2;
    //th.setPriority(QThread::HighestPriority);
    th.start();
    //th.run(1);
    //th2.run2(2);
    th2.start();
    return 0;
    return a.exec();
}

void MyThread::run(int z)
{
    if (z==1) for( int count = 0, x=0; count < 1000000; count++, x++ ) qDebug()<<x<<"+one";
    if (z==2) for( int count = 0, x=0; count < 1000000; count++, x++ ) qDebug()<<x<<"+two";
}

void MyThread2::run2(int z)
{
    if (z==1) for( int count = 0, x=0; count < 1000000; count++, x++ ) qDebug()<<x<<"+one";
    if (z==2) for( int count = 0, x=0; count < 1000000; count++, x++ ) qDebug()<<x<<"+two";
}

И снова ерунда.
QThread: Destroyed while thread is still running
QThread: Destroyed while thread is still running
А если закомментировать start()'ы, и сделать через run(1)|run(2) то выводится 1000000 раз one, а потом столько же two =|

Сообщение отредактировал RazrFalcon - 12.10.2010, 16:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.10.2010, 18:56
Сообщение #24


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

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

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




Репутация:   34  


Цитата(RazrFalcon @ 12.10.2010, 18:29) *
MyThread th;
MyThread2 th2;
//th.setPriority(QThread::HighestPriority);
th.start();
//th.run(1);
//th2.run2(2);
th2.start();
return 0;


ну дык, ещё бы - создаёшь локально, они радостно запускаются, а потом ты их лопатой ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 12.10.2010, 19:20
Сообщение #25


Zombie Mod
*****

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

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




Репутация:   212  


Цитата(Алексей1153 @ 12.10.2010, 18:56) *
ну дык, ещё бы - создаёшь локально, они радостно запускаются, а потом ты их лопатой ))

а?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.10.2010, 20:31
Сообщение #26


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

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

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




Репутация:   34  


RazrFalcon, когда return 0 выкидывает из функции main, то локальные переменные выходят из области видимости и разрушаются
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 12.10.2010, 22:25
Сообщение #27


Zombie Mod
*****

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

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




Репутация:   212  


Алексей1153
без return 0 вообще не стартует, то есть стартует но даже вывода нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 13.10.2010, 6:53
Сообщение #28


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

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


:huh: читать и читать, как создаются и работают потоки и что такое область видимости переменных. до просветления.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 14.10.2010, 20:19
Сообщение #29


Zombie Mod
*****

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

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




Репутация:   212  


Что за ерунда, прога работает только если функция исполняемая предопределена как
void MyThread::run()
если вместо run написать что то другое вообще не работает.
При условии что везде функция имеет одно и то же имя.
То есть я не ошибся при создании класса. Так как компиляци успешна, просто потом стоит на месте.
Почему?

В чем разница между .run() и .start()? У меня одинаковый результат вообще.
Почему после окончания работы функции (потока) она не завершается а так и висит. return; не помогает.

Сообщение отредактировал RazrFalcon - 14.10.2010, 20:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 14.10.2010, 20:38
Сообщение #30


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

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

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




Репутация:   29  


RazrFalcon, ты бы документацию читал, там все подробно описано

Цитата(RazrFalcon)
В чем разница между .run() и .start()?
start создает доп поток и вызывает run уже в новом, созданным им потоке. Если ты просто вывозишь run доп. поток создан не буден.

Цитата(RazrFalcon @ 12.10.2010, 16:29) *
class MyThread2 : public QThread { public: void run2(int i); };
Здесь функция run2 всегда будет вызываться в основном потоке. Так же как и любая другая, кроме run (вызванная через старт)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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