Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.93.209] |
|
Сообщ.
#1
,
|
|
|
Доброе время суток.
пытаюсь сотворить подобие тренда: std::queue<DataForExchange> glDataExch; std::mutex mut; std::condition_variable data_cond; bool endWork = false; double offsetTX = 0.0, offsetMX = 0.0; ... void CIPO1::_getData() { FILE* fp; fopen_s(&fp,"D:/Programs/C++/ProjectGraph/bin/Data/IMET_L1.var01","r"); if (fp == NULL) { ErrMsg("Error"); return; } TCHAR* tcTok = 0; TCHAR del[] = " \t\r\n"; TCHAR buff[1024] = ""; DataForExchange tmp; short c = 0; while (_fgetts(buff,1024,fp) != NULL) { c = 0; tmp.t = _ttof(_tcstok(buff,del)); while (tcTok = _tcstok(0,del)) { if (c == 0) tmp.x = _ttof(tcTok); if (c == 1) tmp.y = _ttof(tcTok); if (c == 2) tmp.z = _ttof(tcTok); if (c == 3) tmp.xv = _ttof(tcTok); if (c == 4) tmp.yv = _ttof(tcTok); if (c == 5) tmp.zv = _ttof(tcTok); ++c; } double skv = tmp.x*tmp.x + tmp.y*tmp.y + tmp.z*tmp.z; tmp.mS = sqrt(skv); double vkv = tmp.xv*tmp.xv + tmp.yv*tmp.yv + tmp.zv*tmp.zv; tmp.mV = sqrt(vkv); std::lock_guard<std::mutex> lg(mut); glDataExch.push(tmp); data_cond.notify_one(); } std::lock_guard<std::mutex> lg(mut); endWork = true; data_cond.notify_one(); } Отрисовка: void drawScena() { std::queue<DataForExchange> items; DataForExchange tmp; std::unique_lock<std::mutex> lg(mut); while (true) { data_cond.wait(lg,[]{return !glDataExch.empty() || endWork;}); items = std::move(glDataExch); for (unsigned int i = 0; i < items.size(); ++i) { tmp = items.front(); glColor3f(1.0,1.0,1.0); glBegin(GL_LINES); glVertex2d(offsetTX,offsetMX); if (tmp.t = 0.0) glVertex2d(tmp.t,tmp.mS/1000.0); else glVertex2d(tmp.t/1000.0,tmp.mS/1000.0); glEnd(); offsetTX = tmp.t/1000.0,offsetMX = tmp.mS/1000.0; items.pop(); } if (endWork) break; } } Ну, и сама функция отрисовка сцены: int _tmain(int argc, _TCHAR* argv[]) { ShowWindow(GetConsoleWindow(),SW_HIDE); CIPO1 exmpl; std::thread t1(&CIPO1::_getData,&exmpl); glutInit(&argc,argv); glutInitWindowPosition(20,20); glutInitWindowSize(winWidth,winheight); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); void _init(); _init(); glutCreateWindow("ipo1_Graph"); void _DisplayFnc(); glutDisplayFunc(_DisplayFnc); void _ReshapeFnc(int,int); glutReshapeFunc(_ReshapeFnc); glutMainLoop(); t1.join(); return 0; } void _init() { glClearColor(0.0,0.0,0.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,(GLdouble)winWidth,-(GLdouble)(winheight/2),(GLdouble)(winheight/2)); } void _ReshapeFnc(int width,int height) { glClearColor(0.0,0.0,0.0,0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,(GLdouble)width,-(GLdouble)(height/2),(GLdouble)(height/2)); glClear(GL_COLOR_BUFFER_BIT); } void _DisplayFnc() { glClear(GL_COLOR_BUFFER_BIT); drawScena(); glFlush(); } График не выводиться. Что я делаю не так? Подскажите, пожалуйста |
Сообщ.
#2
,
|
|
|
Проблема, быть может, не в этом, но ниже наверняка один знак равенства пропущен:
"if (tmp.t == 0.0)" надо?! |
Сообщ.
#3
,
|
|
|
Доброе время суток.
Да, именно это было и причиной Спасибо. Я уже хотел Добавлено Вот только я заметил непонятное для меня. void _DisplayFnc() { glClear(GL_COLOR_BUFFER_BIT); drawScena(); //glFlush(); } Я убрал glFlush() из _DisplayFnc() для того, чтобы видеть процесс. И включил его в drawScena() void drawScena() { std::queue<DataForExchange> items; DataForExchange tmp; std::unique_lock<std::mutex> lg(mut); while (true) { data_cond.wait(lg,[]{return !glDataExch.empty() || endWork;}); items = std::move(glDataExch); for (unsigned int i = 0; i < items.size(); ++i) { tmp = items.front(); glColor3f(1.0,1.0,1.0); glBegin(GL_LINES); glVertex2d(offsetTX,offsetMX); if (tmp.t == 0.0) glVertex2d(tmp.t,tmp.mS/1000.0); else glVertex2d(tmp.t/1000.0,tmp.mS/1000.0); glEnd(); offsetTX = tmp.t/1000.0,offsetMX = tmp.mS/1000.0; glFlush(); items.pop(); } if (endWork) break; } } Вроде прога работает, только через какое-то время график сдвинулся влево, а когда данные кончились вернулся назад. Я увеличил размеры окна проги (winWidth,winheight) и увидел, что этот сдвиг вызывает вертикальная прямая, которая каким-то ... и, не понятно с какого перепугу, рисуется параллельно правому борту окна. Подскажите, пожалуйста, что это за напасть? Может по этому и glutReshapeFunc(_ReshapeFnc) как-то не так работает? |
Сообщ.
#4
,
|
|
|
В вашем конкретно этом случае условие if/else вообще не нужно, ибо случай else полностью обрабатывает вариант if'а при tmp.t равном нулю.
Так что можете убрать и посмотреть, что выйдет. |
Сообщ.
#5
,
|
|
|
Доброе время суток
Цитата Славян @ Так что можете убрать и посмотреть, что выйдет Да, действительно вы правы. Добавлено Вот, только я не понимаю, откуда берется та прямая Может потому, что я добавил задержку void drawScena() { std::queue<DataForExchange> items; DataForExchange tmp; std::unique_lock<std::mutex> lg(mut); while (true) { data_cond.wait(lg,[]{return !glDataExch.empty() || endWork;}); items = std::move(glDataExch); for (unsigned int i = 0; i < items.size(); ++i) { tmp = items.front(); glColor3f(1.0,1.0,1.0); glBegin(GL_LINES); glVertex2d(offsetTX,offsetMX); glVertex2d(tmp.t/1000.0,tmp.mS/1000.0); glEnd(); offsetTX = tmp.t/1000.0,offsetMX = tmp.mS/1000.0; //Вариант 2 std::this_thread::sleep_for(200); glFlush(); items.pop(); //Вариант 1 std::this_thread::sleep_for(200); } if (endWork) break; } } Причем, когда применяю "Вариант 1" линия рисуется одним цветом, а при "Вариант 2" - другим |