Как понять что программа работает в двух потоках? |
Здравствуйте, гость ( Вход | Регистрация )
Как понять что программа работает в двух потоках? |
RazrFalcon |
12.10.2010, 14:38
Сообщение
#21
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
Мне только осталось неясно, почему лог так быстро закончился Лог от последнего примера, там до 10 как раз и есть. они оба выдают "+two". внимательнее надо писать код Да уш, закрутился называется. Но суть в том что я не пойму как заставить разные функции выполнятся. Сейчас я создаю 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 |
Главное чтоб они выводились во время а не как попало (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
И снова ерунда. 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, 19:20
Сообщение
#25
|
Zombie Mod Группа: Участник Сообщений: 1654 Регистрация: 24.5.2010 Из: Харьков Пользователь №: 1752 Спасибо сказали: 64 раз(а) Репутация: 212 |
|
|
|
Алексей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 |
читать и читать, как создаются и работают потоки и что такое область видимости переменных. до просветления.
|
|
|
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 доп. поток создан не буден.class MyThread2 : public QThread { public: void run2(int i); }; Здесь функция run2 всегда будет вызываться в основном потоке. Так же как и любая другая, кроме run (вызванная через старт)
|
|
|
Текстовая версия | Сейчас: 15.1.2025, 11:13 |