• 5248阅读
  • 4回复

[原创]嵌入式ARM开发板Cortex-A5,运行Qt程序,黑屏 GUI线程/子线程均正常工作 [复制链接]

上一主题 下一主题
 

只看楼主 倒序阅读 楼主  发表于: 2017-01-05
回复本帖可获得1RMB金钱奖励!
每人最多可获奖1次,奖池剩余10RMB金钱 (中奖几率10%)
开发板环境:Linux mcuzone 4.1.0-linux4sam_5.3 #154 Fri Nov 25 18:27:57 CST 2016 armv7l GNU/Linux
  由于项目需要,Qt程序需要实时显示从CAN口传来的数据。若把采集数据代码放到MainWindow的Gui线程中,屏幕会假死(qApp->processEvent效果不好),所以开启线程采集数据。第一次开机启动Qt程序时,点击Button弹出Dialog的时,界面会发生抖动(闪屏)界面会黑屏,此时,GUI线程能正常工作(每秒打印一句话),数据子线程也正常工作(能打印),若杀死该程序并重新启动后,闪屏黑屏现象消失,程序能一直正常工作。
    若将   thread->start(); 屏蔽,即关闭子线程。则第一次开启只会闪屏,并不会黑屏(%99不黑屏)!
    若将子线程中的数据部分全部去掉,第一次开启还是有可能会黑屏的!
关键代码:
MainWindow.cpp
  
    thread = new Thread;
    connect(thread,SIGNAL(DISPLAY_DZ_DATA()),this,SLOT(DISPLAY_DZ_DATAMain()));
    thread->start();
/***/
thread.h  
     class Thread : public QThread
{
    Q_OBJECT
public:
    Thread();
    ~Thread();

    void stop();

protected:
    void run();

private:
    QMutex mutex;
    volatile bool stopped;
    uint32_t dlen;

signals:
    void DISPLAY_DZ_DATA();
};

/*****/
thread.cpp
    Thread::~Thread()
{

}

void Thread::run()
{
    int jishuqi = 0;
#if 1
    can = 1;
    s =  PanelSocketCanOpen(can);
#endif
    while(threadisrun == 0)
    {
        mutex.lock();
        printf("jishuqi:%d\n",jishuqi);
        jishuqi++;

        dlen = PanelCanRecvData(s,bufferOriginal,sizeof(bufferOriginal));  //从CAN口接收数据
   //     printf("PanelCanRecvData have got,dlen = %d\n",dlen);

        uint8_t *OriginalPoint;  //指针,指向数组
        uint8_t bufType;
        int8_t bufState;
        bufType = bufferOriginal[0];
        bufState = bufferOriginal[1];
        OriginalPoint = &bufferOriginal[2];
        if(ParamInfo._packTyp == COMMAND_CODE_DZ_GET){
                    if (ParamInfo._devId == 6 || ParamInfo._devId == 7 || ParamInfo._devId == 8){
     //                   emit DISPLAY_DZ_DATA();
                        for (int i = 0; i<TRUE_YCDZ_DOT; ++i){
                            //            printf("1_ParamInfo._paramDatas[%d] = %02X\n",i,ParamInfo._paramDatas);
                        }
                    }
        }

         ......更多工作代码......
        mutex.unlock();
        msleep(200);//不加这句CPU占用率高达50%
    }
}
离线shf1986

只看该作者 1楼 发表于: 2017-01-10
用的哪个a5的片子?......
QQ:173409750
Atmel SAMA5D3x(QQ群:476153000)
TI AM335x(QQ群:275644633)
Qualcomm/NXP/Freescale iMX6(QQ群:47768065)
嵌入式Qt、MySQL(QQ群:437438881)

只看该作者 2楼 发表于: 2017-02-10
ATSAMA5D35//这是CPU 班子是mcuzone的,已经坏了,按照他的原理图自己画的新的。没有串口,直接从核心板引出来接的终端!!
离线shf1986

只看该作者 3楼 发表于: 2017-02-10
回 哥依然潇洒 的帖子
哥依然潇洒:ATSAMA5D35//这是CPU 班子是mcuzone的,已经坏了,按照他的原理图自己画的新的。没有串口,直接从核心板引出来接的终端!! (2017-02-10 11:22) 

我之前搞过a5d36......
QQ:173409750
Atmel SAMA5D3x(QQ群:476153000)
TI AM335x(QQ群:275644633)
Qualcomm/NXP/Freescale iMX6(QQ群:47768065)
嵌入式Qt、MySQL(QQ群:437438881)

只看该作者 4楼 发表于: 2017-02-14
回 shf1986 的帖子
shf1986:我之前搞过a5d36...... (2017-02-10 15:34) 

签名的是不是您的QQ号码,能不能交流一下啊!
快速回复
限100 字节
 
上一个 下一个