ibash.org.ru - Новый цитатник Рунета

Форум: [быдлокод]Qt4 Отрисовка в реальном времени 1 > [RSS]

Форум: Вход Регистрация Участники Поиск RSS

JoraX
12.12.2009 - 17:56

Доброго времени суток, подскажите пожалуйста, задача, собирать данные со звукового входа, и отоображать их в виде графика в реальном времени. Своеобразный осциллограф)
Есть дочерний поток, бесконечно читающий файл /dev/dsp и выводящий в основное приложение прочитанные значения. Там, в свою очередь функция формирует из этих значений массив координат Y, и перерисовывает экран. при этом наблюдаются значительные тормоза, и график "запаздывает"). Подскажите пожалуйста куда курить, и что копать?

3123
#1 - 12.12.2009 - 18:03

Кастую телепатов в тред. )

JoraX
#2 - 12.12.2009 - 18:13

частично код)

MyThread.cpp - поток, обрабатывающий файл
void MyThread::run() {
while (true) {
file->read((char *)&buf, 1);
//usleep(50);
emit isReady((int)buf);
}

GlWidget.cpp

GlWidget::GlWidget {
for (float i = -1;i<1;i+=0.1)
{
massPointX << i; //((width()/10) * i)+10;
}
}

paintGL(){ // Отрисовка
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_LINE_STRIP);
glColor3f(1,0,0);
for(int i=0;i<massPointX.count();++i) {
if (massPointY.count() <= i)
break;
glVertex2f(massPointX[i], massPointY[i]/1000);
}
glEnd();
}
}
void draw(int buf){ // слот, принимающий от потока сигналы
if (count > width())
count = 0;
count++;
float posY = ((buf));
massPointY << posY;
Y = posY;

if (massPointY.count() > massPointX.count())
massPointY.removeAt(0);
updateGL();
}

GlWidget.h

QList<float> massPointX;
QList<float> massPointY;

anonimous
#3 - 12.12.2009 - 18:15

opengl?

JoraX
#4 - 12.12.2009 - 18:19

угу. В связке с Qt

Iwan
#5 - 13.12.2009 - 03:36

А загрузку проца смотрел при этом? И нагрузку на диски?

JoraX
#6 - 13.12.2009 - 11:41

Загрузка процессора 100% на диски малая нагрузка, связанно это с тем, что файл псевдоустройства читается побитно. пробовал считывать в буфер размером 2048, но не слишком помогло

вфы
#7 - 13.12.2009 - 16:49

Совсем дурацкий вопрос: ты пробовал использовать профайлер? )

JoraX
#8 - 13.12.2009 - 17:18

нет, а это собственно что? :[

вфы
#9 - 13.12.2009 - 20:27

Что-то подобное. Или вручную замерить время выполнения кусков кода. )
http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%D1%80

anonimous
#10 - 14.12.2009 - 10:33

думаю тормоза возникают при
massPointY << posY;
может стоит заменить на QVector и сначала сделать QVector::reserve(100500)

вфы
#11 - 14.12.2009 - 17:23

Т.е. QList - связанный список? Тогда это ппц )

JoraX
#12 - 14.12.2009 - 17:33

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

anonimous
#13 - 15.12.2009 - 03:41

вфы, нет связный список - QLinkedList
QList хранит массив указателей

ZL[]RD
#14 - 16.12.2009 - 02:48

/dev/dsp напрямую читаешь? Да, имел я глюки при этом. И огромные. Либо юзай универсальные либы, либо точи под альсу, жака и иже с ними. Выигрыш в миллисекундах, как ни странно будет это звучать, все-таки имеется.

Ским
#15 - 17.12.2009 - 02:51

а можешь потом поделиться исходниками и выложить их под GPL? я для них даже пакет сделаю и может когда-нибудь на досуге помогу подпилить (сейчас просто тонна всего свалилась)
К списку вопросовСтраницы: 1 >

Быстрый ответ
Имя:      Пароль:    
Текст сообщения:

«ibash.org.ru — Новый цитатник Рунета» Почта вебмастера: imail@ibash.org.ru