查看: 1634|回复: 5

大家好!有时间给帮忙看下这个问题,谢谢

[复制链接]

该用户从未签到

发表于 2009-10-19 16:11:36 | 显示全部楼层 |阅读模式
大家好啊!我的程序在运行开始出现了一个在小菜能力范围外的一个错误,程序运行后,场景出现一到两秒,然后全屏就是那个clearclor的颜色,ESC退出程序,弹出一些如图的提示,是怎么回事啊?大家百忙中抽空给看一下,谢谢!
error.jpg

该用户从未签到

发表于 2009-10-19 19:47:51 | 显示全部楼层
矩阵数据有问题,除0了,或者是有虚数。你检查下?

该用户从未签到

 楼主| 发表于 2009-10-19 19:51:28 | 显示全部楼层
本帖最后由 woshijiameizhou 于 2009-10-19 20:19 编辑

我在osg的while循环之前用_beginthread() 创建一个线程去获得方向盘等外设的采集的数据,然后更新控制小车的一些参数。如果不创建这个线程,则osg的渲染正常。后来我改为从OpenThreads::Thread派生一个线程类,在这个类的run()中采集外设数据,类的定义如下:

1# woshijiameizhou
#ifndef MYTHREAD_H
#define MYTHREAD_H


#include <OpenThreads/Thread>
#include <hysics/Car.h>
#include "USBRacingWheel.hpp"


class MyThread : public OpenThreads::Thread
{
public:
        MyThread(osgVehicle:hysics::Car* car,USBRacingWheel &USB) :_done(false)
        {
                m_car = car;
                usb = USB;
        };
        virtual ~MyThread() {};

        virtual void run()
        {
                float engineForce = 0.f;
                float breakForce = 1.0;
                WheelInfo info;
                while(!_done)
                {
                        info = usb.getEventsInputData();
                        m_car->SetTurn(info.wheelAngle);
                        m_car->SetEngineForce(info.wheelEngine * info.gearPara);
                        m_car->SetBrake(info.wheelBrake);
                        OpenThreads::Thread::microSleep(1);
                }
        };

        void stopWorking() {_done = true; };

protected:
        bool _done;
        osgVehicle::Physics::Car* m_car;
        USBRacingWheel usb;
};

#endif


在osg的while循环之前new了这个派生的线程的一个对象,并启动了它(如下代码),可是程序好像就停在了这个线程类的run()里面,不会执行到osg的那个while循环。大家或者能不能谈一下怎么用这个OpenThreads::Thread,谢谢!

        USBRacingWheel USB;
        MyThread* updateVehicleInfoThread = NULL;
        if(USB.IsOK())
        {
                updateVehicleInfoThread = new MyThread(driverCar,USB);
                updateVehicleInfoThread->Init();
                updateVehicleInfoThread->start();
                updateVehicleInfoThread->run();
        }

该用户从未签到

 楼主| 发表于 2009-10-19 19:59:26 | 显示全部楼层
2# diyer2002
不是啊,我在osg的while循环之前beginthread 了一个线程,就成这样子了,我做了个比较肤浅的判断:我把线程注释掉了就好了,那个线程和osg没有一点关系啊,却影响了osg,郁闷。

该用户从未签到

 楼主| 发表于 2009-10-19 20:29:53 | 显示全部楼层
getEventsInputData内部用了ReadFile读USB接口,如果在回调中,或者 从GUIEvents 派生处理USB数据,都会被ReadFile阻塞,所以我重开了个线程。如果不重开线程,大家能不能提供一些其他有效的方案,谢谢!

该用户从未签到

发表于 2009-10-19 22:51:36 | 显示全部楼层
先大致了解一下POSIX线程编程的基本原理吧,您对线程库的操作恐怕完全不正确,看一看最常见的pthreads的用法,和OpenThreads的机理都是一致的;或者您也没必要非要用线程来实现,在回调里,或者重载eventTraversal函数,都是比较简单的选择
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表