问题是这样的,我用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)这个函数里面就导致界面未响应,请问到底是什么原因呢?