crossplatform.ru

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

6 страниц V  < 1 2 3 4 > »   
Ответить в данную темуНачать новую тему
> многопоточность QThread
ufna
  опции профиля:
сообщение 18.4.2010, 11:27
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


Цитата(SABROG @ 16.4.2010, 22:56) *
По количеству ядер на проце. Выше этого числа уже прироста не будет никакого, только бесполезная трата оперативки и расходы на переключение между потоками.


Ну не согласен. "Вторые" и следующие потоки должны выполнять свои действия параллельно, чтобы не тормозить отрисовку. Как реализовать нормальное действие, когда нужно параллельно, чтобы для юзера это никак не сказывалось:

- провести отрисовку несколько десятков изображений
- просчитать маршрут по карте
- считать и обработать данные с устройства с четко заданным интервалом и вести контроль местоположения на карте

при этом общее устройство - это PNA?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 18.4.2010, 16:53
Сообщение #12


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


мне бы нужно хотябы два-три потока сделать, но опять же чтобы не напрягало систему до безпредела)) но почему то все советуют, что если нет крайней необходимости во многопоточности, то ее вообще лучше изключить)) но мне бы все же хотелось чтобы моя прога была многопоточная - это интереснее будет думаю)) мне нужна скорость высокая выполнения, допустим прога должна провести за один запуск 100 циклов с целой кучей всякой хрени в них, так вот, будет бустрее если она будет выполняться в нескольких потоках или в одном?)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.4.2010, 17:11
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(eldar85 @ 18.4.2010, 20:53) *
будет бустрее если она будет выполняться в нескольких потоках или в одном?)
если процессор один (одноядерный), то всё равно все процессы в нём выполняются последовательно. Т.е. многопоточность не увеличивает скорость. А так как ОСьке придётся ещё и переключать потоки, то будет медленнее, чем в один поток
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 18.4.2010, 18:12
Сообщение #14


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


да, именно так. Когда обработка идет "надо сделать все", то количество потоков увеличивать имеет смысл только в н-ядерных процессорах, либо "чтобы не вешало GUI".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 18.4.2010, 21:08
Сообщение #15


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


понятно, спасибо))
я просто чем был удивлен, скачал тут недавно программу прокси-чекер, так она 15 потоков сразу использует))) причем работает достаточно быстренько - а у меня двух ядерный бук 2,2Ггрц и оперативки 3гбайт.
а я попробывал на кьюти написать самый простенький пример из трех потоков, как комп начал вешаться, вентилятор на проце дико заревел аж))))))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 7.6.2010, 19:47
Сообщение #16


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


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

вот класс потока:
class Thread : public QThread
{
    Q_OBJECT
public:
  Thread()
  {
  }



  void run(int i);


};




#endif // THREADS_H


вот описание функции run();

void Thread::run(int i)
{

QString sait = list[i];  \\"http://google.ru", "http://ya.ru", "http://mail.ru", "http://google.ru" и так далее

        curl->load(sait)->exec(); //Это загрузка гугла через курл





finished();

}



int mainWindow::Start()
{
  

a = list.length();
Thread thread;

    for(int i=0; i<a; i++)
    {



    thread.run(i);
    thread.start();
  

    }


    return 0;
}






особенно мне не нравится вот эта надпись в консоли - QThread: Destroyed while thread is still running
вроде все что должен выполнил(все страницы загрузил), а в консоль вывел эту шнягу. подскажите пожалуйста что не так...
и главное страицы загружаются все равно как то по очереди... я правильно запускаю потоки в цикле или нет?

Сообщение отредактировал eldar85 - 7.6.2010, 20:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.6.2010, 15:19
Сообщение #17


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

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


thread.run(i);


Нельзя так запускать поток, метод run() только для переопределения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 10.6.2010, 23:41
Сообщение #18


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


а как можно?)
я вот сделал вот так сейчас
void mainWindow::Start()
{
Thread thread;
list1 << "1" << "2" << "3"<< "4" << "5" << "6"<< "7" << "8" << "9"<< "10" << "11" << "12"<< "13" << "14" << "15";
list2 << "101" << "102" << "103"<< "104" << "105" << "106"<< "107" << "108" << "109"<< "110" << "111" << "112"<< "113" << "114" << "115";
QString q1;
QString q2;
        for(int i=0; i<14; i++)
{
q1 = list1[i];
q2 = list2[i];

    thread.run(q1, q2);
    thread.start();
}


}

void Thread::run(QString str1, QString str2)
{
       qDebug() << str1 << str2;
}

прога то нормально все завершит, то вылетает.
и в консоли всегда вот это - QThread: Destroyed while thread is still running

если все что делается в потоках должно делаться в функции run(); то как же в нее передать параметры которые я в главном окне получаю, те что введены в текстовое поле???

и вот так тоже вылетает
void mainWindow::Start()
{
Thread thread;
list1 << "1" << "2" << "3"<< "4" << "5" << "6"<< "7" << "8" << "9"<< "10" << "11" << "12"<< "13" << "14" << "15";
list2 << "101" << "102" << "103"<< "104" << "105" << "106"<< "107" << "108" << "109"<< "110" << "111" << "112"<< "113" << "114" << "115";

        for(int i=0; i<14; i++)
{
q1 = list1[i];
q2 = list2[i];

    thread.run();
    thread.start();
}


}

void Thread::run()
{
       makeFunktion(q1, q2);
}

void Thread::makeFunktion(QString str1, QString str2)
{
        qDebug() << str1 << str2;
}


как же мне тогда соединить slot Start() с кнопки на окне приложения и run()?????? уже даже эти переменные
QString q1;
QString q2;
QStringList list1;
QStringList list2;
как глобальные переменные и вылетает все равно. что не так??? может как то потоки нужно контралировать??

ставлю ожидание небольшое то не вылетает, но почему то в консоль все в двух экземплярах выводит
        for(int i=0; i<14; i++)
{
q1 = list1[i];
q2 = list2[i];

    thread.run();
    thread.start();
    Sleep(100);

}




"1" "101"
"1" "101"
"2" "102"
"2" "102"
"3" "103"
"3" "103"
"4" "104"
"4" "104"
"5" "105"
"5" "105"
"6" "106"
"6" "106"
"7" "107"
"7" "107"
"8" "108"
"8" "108"
"9" "109"
"9" "109"
"10" "110"
"10" "110"
"11" "111"
"11" "111"
"12" "112"
"12" "112"
"13" "113"
"13" "113"
"14" "114"
"14" "114"

зато вот эта хрень пропала из консоли QThread: Destroyed while thread is still running

и вообще такое ощущение что все в один поток работает, если я ставлю в функцию nakeFunktion() ожидание в пару секунд, то каждый вывод в консоли как раз и происходит каждые 2 секунды, но потоки же должны работать в одно время или почти в одно и вывод должен происходить быстрее... по моему я не так вызываю потоки...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 11.6.2010, 0:40
Сообщение #19


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


eldar85, ты должен вызывать только Thread::start(). Он, в свою очередь, вызывает run()
Под "переопределить метод" понимается, создать в наследнике точно такую же функцию, не изменяя её сигнатуры (имени и типа аргументов)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 11.6.2010, 1:16
Сообщение #20


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

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




Репутация:   0  


но мне нужно чтобы каждый поток работал с функцией makeFunktion(QString q1, QString q2) ; но с разными переменными, например мне нужно передать в функцию makeFunktion(QString q1, QString q2) ; два параметра, но в каждом потоке они должны быть разными. значит run() вызывать вообще не нужно, хммм))) ок, буду пробывать, потому что так как я сделал прога вылетает))) спасибо за совет, попробую отпишусь)

но в метод run()
{
//я же могу что угодно накидать для выполнения? правильно?
}

а я правильно в цикле потоки вызываю если оттуда метод run() убрать из цикла? или каждый поток должен называться по разному???
 for(int i=0; i<8; i++)
{



    thread.start();


    

}



я хочу сделать чтобы с главного окна можно было в спинбоксе поставить сколько потоков будет работать. и соответственно не могу каждый поток подписать так:
Thread thread1;
Thread thread2;
Thread thread3;
......
потому что точно не знаю сколько поставлю потоков, возможно захочу 2, а возможно 10...
ну это так к слову, мне бы научиться их вызывать, весь гугл перерыл, но кругом описано как сделать две кнопки и чтобы нажал одну пошел первый поток, нажал вторую пошел второй поток... мне нужно в цикле их запускать ...

попробывал не вызывать метод run() прога тут же вылетает.
void mainWindow::Start()
{
Thread thread;
list1 << "1" << "2" << "3"<< "4" << "5" << "6"<< "7" << "8" << "9"<< "10" << "11" << "12"<< "13" << "14" << "15";
list2 << "101" << "102" << "103"<< "104" << "105" << "106"<< "107" << "108" << "109"<< "110" << "111" << "112"<< "113" << "114" << "115";


        for(int i=0; i<5; i++)
{
          
    thread.start();

}


}

void Thread::run()
{
       makeFunktion(q1, q2);


}

void Thread::makeFunktion(QString str1, QString str2)
{

  
  Sleep(1000);
  qDebug() << q1 << q2;
      
}

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

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


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




RSS Текстовая версия Сейчас: 28.6.2024, 2:49