• 2652阅读
  • 2回复

在回调函数里发送信号,将变量显示到界面上,界面未响应 [复制链接]

上一主题 下一主题
离线gy19920615
 

只看楼主 倒序阅读 楼主  发表于: 2018-01-29
问题是这样的,我用CAN盒子通讯,做上位机界面串口初始化后调用事件回调函数,在回调函数里读取CAN盒子发送过来的数据并发送一个 DataShow(c)信号,槽函数对界面的控件赋值,编译能通过,但是连上CAN打开通讯后,界面无响应,我已经验证了信号槽函数都写对了,在类函数里调用的话能显示一个正常的值c,但是在回调函数里同样的方式就是不行,求大神答疑~
.h文件,
在MainWindow类里声明了信号和槽
signals:
    DataShow(double c);
private slots:
   void setValueVol(double);
声明了静态函数
private:
   static DWORD __stdcall PDoTest(DWORD EventID, LPVOID pBuf, DWORD BufLen, LPVOID UserData

.c文件,将信号和槽连接了起来:
MainWindow::MainWindow(QWidget *parent):
QMainWindow(parent),ui(new UI::MainWindow)
{
ui->setupUi(this);
.....
connect(this,SIGNAL(DataShow(double)),this,SLOT(setValueVol(double)));
....
}

串口初始化函数里面有一个设置事件回调函数:
    ZCOMA_SetEventCallback(hdChannel, PDoTest, NULL, 0,0);
该函数来厂家提供的函数库文件,作用是接受到数据就调用一次回调函数。
重点来了,回调函数是一个静态函数,在里面读取CAN发送的数据,并显示到主界面上:
DWORD __stdcall MainWindow:: PDoTest(DWORD EventID, LPVOID pBuf, DWORD BufLen, LPVOID UserData)
{
...
ManWindow * pUse = (MainWindow *)UserData;
c=(float)(data[1]+data[2])/1000;
emit pUse->DataShow(c);      
}

槽函数如下:
MainWindow::setValueVol(double)
{
QString temStr;
ui->NUMERIC_C->setText(tempStr.setNum(c));
}
      已经验证过了如果把emit pUse->DataShow(c) 这句话放在别的函数里面就能成功的在界面上显示c的数值,放到 static DWORD __stdcall PDoTest(DWORD EventID, LPVOID pBuf, DWORD BufLen, LPVOID UserData)这个函数里面就导致界面未响应,请问到底是什么原因呢?
离线大漠之鹰

只看该作者 1楼 发表于: 2018-01-29
搞不懂你为什么这么用,实现过好多这样的功能,没有这么用过
本是后山人,偶作前堂客,醉舞经阁半卷书,坐井说天阔。大志戏功名,海斗量福祸,论到囊中羞涩时,怒指乾坤错
QQ:874164244
在线uidab

只看该作者 2楼 发表于: 2018-01-30
不要在非UI线程里面处理UI要做的事情
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
快速回复
限100 字节
 
上一个 下一个