日志
嵌入式ARM开发板Cortex-A5,运行Qt程序,黑屏 GUI线程/子线程均正常工作
2017-01-05 15:20
开发板环境: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% } } |
下一篇: 无
上一篇: 无