标题:Qt多线程传输变量的问题
作者:liruigood
日期:2016-12-06 22:25
内容:
问题如下:
我子类化Qthread创建了三个线程类,Qtcpthread用来通讯;Qserialthread用来读取传感器串口的值;Qcontrolthread用来做pid等算法控制;前两者读取到的反馈值传给第三者,第三者做处理后将输出值传给Qtcpthread,用于直接控制;这三个线程run()都是while死循环;数据传输是用信号与槽的方式,emit和slot,他们分别在主线程,也就是ui线程中转;问题出在Qcontrolthread emit一个信号给Qtcpthread,程序运行出现了中断,出现了如下错误:HEAP: HEAP: Free Heap block 7d2ecd8 modified at 7d2ee20 after it was freed。然后我把Qcontrolthread线程中的emit信号发送屏蔽掉不发送,同时运行就没有问题。只运行Qtcpthread和Qserialthread和只运行Qserialthread和Qcontrolthread信号传输也都没有问题。所以就不知道是哪个模块出来问题,求解?
这是Controlthread的run()函数:
void ControlThread::run()
{
static int count = 0;
while (true)
{
count++;
if (count>50000)
{
AutoControlPacket.clear();
//float OutputPosition = Torque_Control_PID(ControlData.MorotData.CurrentPoition,60*182.045);
AutoControlPacket.name = "AotoControl";
AutoControlPacket.hexString.append(QString("VL.CMDU %1\r\n").arg(500));
emit SendControlCmdPacket(AutoControlPacket);
count = 0;
}
}
}
emit SendControlCmdPacket(AutoControlPa ..
#1 [patrickwf 12-07 08:27]
贴代码比较直观
#2 [bran_lee 12-07 11:51]
AutoControlPacket到底是什么时候创建的?是全局的还是局部的?信号传的是引用?传到另一个线程后AutoControlPacket会不会被析构?
#3 回 bran_lee 的帖子 [liruigood 12-07 14:47]
bran_lee:AutoControlPacket到底是什么时候创建的?是全局的还是局部的?信号传的是引用?传到另一个线程后AutoControlPacket会不会被析构? (2016-12-07 11:51)
AutoControlPacket是ControlThread的私有变量,槽函数是这样
void demo::semdControlPacket(Packet packet)
{
Packet resu = packet;
emit sendcontroloutput(resu);
}
导一下emit sendcontroloutput(resu)再把数据传到Qtcpthread线程;用于控制;
奇怪的是今天我把上面代码这步分删了
//发送自动控制命令包
if (!sendControlPacket.hexString.isEmpty())
{
Sendpacket.name = sendControlPacket.name;
Sendpacket.hexString = sendControlPacket.hexString;
clientConnection->write(Sendpacket.getByteArray());
clientConnection->waitForBytesWritten(10);
Sendpacket.clear();
sendControlPacket.clear();
  ..
#4 [sunnyw0n 12-07 17:05]
void demo::semdControlPacket(Packet packet)
{
Packet resu = packet;
emit sendcontroloutput(resu);
}
Packet 出了函数作用域不是析构了么?
#5 回 sunnyw0n 的帖子 [liruigood 12-07 18:50]
sunnyw0n:void demo::semdControlPacket(Packet packet)
{
Packet resu = packet;
emit sendcontroloutput(resu);
}
....... (2016-12-07 17:05)
你的意思是AutoControlPacket这个ControlThread的私有变量被传完之后构析了?我之前一直以为emit 的参数是不会出enit所在的函数的作用域的。谢谢啊,我再看看。