crossplatform.ru

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

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


Zombie Mod
*****

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

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




Репутация:   212  


Еще парочку моментов.
1) Когда я создаю 2-а потока, то на самом деле их 3-и.
2) Я не выбираю ядра, то есть сама система выбирает. Она может их (потоки) поменять местами во время работы?
3) Когда прога работает основным потоком, а потом я создаю 2-й поток, то он помещается на свободное ядро (1-е, 2-е, 3-е и тд).
4) Как я понял с гуем и файлами лучше работать в один поток.

Сообщение отредактировал RazrFalcon - 5.10.2010, 18:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
CodeHunter
  опции профиля:
сообщение 5.10.2010, 18:49
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 33
Регистрация: 26.8.2010
Пользователь №: 1982

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




Репутация:   0  


Цитата(RazrFalcon @ 5.10.2010, 18:21) *
Она может их (потоки) поменять местами во время работы?


Нет !! Это передача инфы между ядрами(процесорами) очень затратное время !!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 5.10.2010, 20:02
Сообщение #13


Участник
**

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

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




Репутация:   11  


Цитата(RazrFalcon @ 5.10.2010, 19:21) *
Еще парочку моментов.
1) Когда я создаю 2-а потока, то на самом деле их 3-и.
2) Я не выбираю ядра, то есть сама система выбирает. Она может их (потоки) поменять местами во время работы?
3) Когда прога работает основным потоком, а потом я создаю 2-й поток, то он помещается на свободное ядро (1-е, 2-е, 3-е и тд).
4) Как я понял с гуем и файлами лучше работать в один поток.

1) Да ты создаешь не 2-а потока а 2-а дополнительных потока. Ведь main тоже должен выполняться в потоке, поэтому у любой программы сразу есть один поток, это "основной поток". В нем отрисовываются/обновляются контролы. Замечал наверное, иногда окна программ становятся белыми, и программы не отвечают на нажатия кнопок и мыши, это когда основной поток чем то сильно занят и не успевает обработать GUI.

2) Ядра ты не выбираешь, система сама лучше знает как разместить задачи. Ведь в системе кроме твоей программы еще куча всего крутиться, и другие программы то-же хотят поработать, так что это задача системы оптимально раскидать задачи по ядрам.

3) Скорее всего да. Хотя на 100% гарантировать нельзя, смотри п.2 про чужие программы.

4) С гуем лучше работать не просто в один поток а в основном потоке. А что значит с файлами? Простая ситуация если одновременно надо обрабатывать несколько файлов - можно каждый файл обрабатывать в отдельном потоке. Но надо помнить о синхронизации между потоками. Гораздо более сложная ситуация если надо обрабатывать один большой файл, если работу можно разбить на одновременные подзадачи, то можно обрабатывать части файла в несколько потоков. Но это гораздо сложнее с точки зрения синхронизации. В общем делать потоки, или нет, и сколько зависит от задачи.


P.S. Какие у тебя разнообразные интересы и GUI/CLI, и библиотеки, и время выполнения, и потоки. Ты просто изучаешь разные вещи или что-то реальное пишешь, во втором случае IMHO что-то ты с дизайном программы мудришь, возможно твою задачу можно решить проще. Опиши задачу, тебе подскажут куда копать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 5.10.2010, 22:34
Сообщение #14


Zombie Mod
*****

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

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




Репутация:   212  


Цитата(Sokoloff @ 5.10.2010, 20:02) *
А что значит с файлами?
Да я про обычный текстовик думал. Ну а в принципе все как я и думал.
Цитата(Sokoloff @ 5.10.2010, 20:02) *
P.S. Какие у тебя разнообразные интересы и GUI/CLI, и библиотеки, и время выполнения, и потоки. Ты просто изучаешь разные вещи или что-то реальное пишешь, во втором случае IMHO что-то ты с дизайном программы мудришь, возможно твою задачу можно решить проще. Опиши задачу, тебе подскажут куда копать.
оффтоп
В общем я мучать начал openCV. А потом пошло. Интерфейс не нужен в общем - значит надо с консолькой разобраться, ну или лубу написать а потом подключать к гую. Потом понял что виснет безбожно - распараллеливание. Потом надо понять на сколько мои усилия сделали ее более быстрой - вот и время понадобилось. А в общем я просто решил поучится разному. Дизайнер из меня никудышный, вот и мучаю всякое. Начал OGRE и bullet physics учить, понял что многого не знаю, а они без оптимизации вообще деревянные и на моем ноуте не первой свежести вообще еле идут. Вот и решил основам оптимизации поучится. Помочь мне нечем, просто сталкиваюсь с проблемой и пытаюсь решить походу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 5.10.2010, 23:26
Сообщение #15


Участник
**

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

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




Репутация:   11  


Цитата(RazrFalcon @ 5.10.2010, 23:34) *
Цитата(Sokoloff @ 5.10.2010, 20:02) *
А что значит с файлами?
Да я про обычный текстовик думал. Ну а в принципе все как я и думал.

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

Про OpenCV подсказать не смогу, не сталкивался. Про GUI/CLI ответил в другом треде.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 6.10.2010, 10:53
Сообщение #16


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

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

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




Репутация:   12  


по первому посту:
если юзаешь вывод куда-то - это сильно тормозит исполнение. любой вывод - чудовищно медленный.
забить проц наглухо можно любым бесконечным циклом. и добавить атомарное выполнение или риал-тайм приоритет - тогда точно кердык: вырубать комп отключением питания, ибо клавиатура и всё остальное станут бесполезны :) только нафига это, если не секрет?

а из двух потоков писать в один файл лучше так: создать общее хранилище для сообщений и туда их оперативно сбрасывать из рабочих потоков (естественно, под мьютексами), а из основного потока (ну или из какого-то третьего) периодически сбрасывать накопленное в хранилище в файл.

Сообщение отредактировал Iron Bug - 6.10.2010, 11:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 11.10.2010, 21:01
Сообщение #17


Zombie Mod
*****

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

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




Репутация:   212  


И снова непонятно что
cpp
#include <QtCore/QCoreApplication>
#include <QString>
#include <QDebug>
#include <qthread.h>
#include <QThread>

class MyThread : public QThread
{
     Q_OBJECT

protected:
     void run();
};

class MyThread2 : public QThread
{
     Q_OBJECT

protected:
     void run2();
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyThread th;
    MyThread th2;
    th2.setPriority(QThread::HighestPriority);
    th.setPriority(QThread::HighestPriority);
    th.start();
    th2.start();
    for( int count = 0, x=0; count < 20000000; count++, x++ ) qDebug()<<x<<"+one";
    return a.exec();
}

void MyThread::run()
{
    for( int count = 0, x=0; count < 20000000; count++, x++ ) qDebug()<<x<<"+two";
}

void MyThread2::run2()
{
    for( int count = 0, x=0; count < 20000000; count++, x++ ) qDebug()<<x<<"+three";
}
В выводе вообще "+three" нет, и +one | +two как то по странному выводятся, то долго один, потом долго другой, то по очереди (короткое время совсем).
Я так понимаю это по тому что основной процесс (one) у меня без приоритета запускается.
Суть в том что я не пойму как запустить два Разных процесса, одинаковые работают, а вот с разными не получается.
-----------------------------------------
Еще один не совсем логичный случай
cpp
class MyThread : public QThread
{
public:
     void run(int i);
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    MyThread th, th2;
    th.start();
    th.run(1);
    th2.run(2);
    return 0;
    return a.exec();
}

void MyThread::run(int z)
{
    if (z==1) for( int count = 0, x=0; count < 10; count++, x++ ) qDebug()<<x<<"+one";
    if (z==2) for( int count = 0, x=0; count < 10; count++, x++ ) qDebug()<<x<<"+two";
}
log
0 +one
1 +one
2 +one
3 +one
4 +one
5 +one
6 +one
7 +one
8 +one
9 +one
0 +two
1 +two
2 +two
3 +two
4 +two
5 +two
6 +two
7 +two
8 +two
9 +two
QThread: Destroyed while thread is still running
Они же должны выполнятся параллельно а не последовательно. :(

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


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

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

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




Репутация:   34  


RazrFalcon, ОС раздаёт всем потокам всех процессов кусочки времени (time slices), в винде, к примеру, это около 16 мс (если не вру). Так обеспечивается многозадачность ОС
Поток волен в это время вовсю работать (если только его ядро системы не прерывает для каких-то нужд). Они у тебя и работают - видимо, за этот слайс поток успевает вывести столько сообщений.
Мне только осталось неясно, почему лог так быстро закончился

А вот ежели отдавать часть слайса в систему методом msleep(0) , тогда всё будет вперемешку, по идее
void MyThread2::run2()
{
    for( int count = 0, x=0; count < 20000000; count++, x++ )
    {
        qDebug()<<x<<"+three";
       msleep(0);//поток отдаёт остаток своего времени для работы другим потокам
    }
}


Сообщение отредактировал Алексей1153 - 12.10.2010, 6:19
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 12.10.2010, 6:49
Сообщение #19


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

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

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




Репутация:   12  


Цитата(RazrFalcon @ 12.10.2010, 0:01) *
В выводе вообще "+three" нет

правильно. и не будет, потому что:
MyThread th;
MyThread th2;

они оба выдают "+two". внимательнее надо писать код :)

Сообщение отредактировал Iron Bug - 12.10.2010, 6:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 12.10.2010, 7:03
Сообщение #20


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

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

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




Репутация:   34  


гы, а я и не обратил внимания ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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