可以这样用QList吗?

youhao1999 2011-12-05 09:51:40
可以这样用QList吗?
功能:上位机一边在主线程中从usb接收数据,一边在分线程中从串口转发出数据

定义了全局QList变量
在主线程中,接收USB数据, m_zfList.push_back(m_data)
在转发线程中发送:
char buf[25];
int b = 10;
if(!m_zfList.isEmpty())
{
float temp = m_zfList.takeLast();
gcvt(temp,b,buf);
myCom_288->write(buf);

}
点击开始发送按钮,开始接收数据并同时转发,请问这样做可以吗?
...全文
263 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
youhao1999 2011-12-07
  • 打赏
  • 举报
回复
你说的很有道理,QSemaphore类在这个程序中如何运用?[Quote=引用 4 楼 whyboysa 的回复:]
楼主可以用QT里的信号量来解决, 这个与“生产者消费者”问题有些类似。 这样做可以通过按键控制线程的循环读,然后在分线程中判断信号量,再往外发。 这样在发之前,写进qlist里的东西也不会被冲洗。
信号量类是QSemaphore类。
[/Quote]
youhao1999 2011-12-07
  • 打赏
  • 举报
回复
这样不行,分线程重复发数了[Quote=引用 1 楼 zhh_steven 的回复:]
疑问:接收数据和转发数据都是无限循环吗?

建议:
使用QMutex对全局QList变量进行保护
[/Quote]
youhao1999 2011-12-07
  • 打赏
  • 举报
回复
求助!
whyboysa 2011-12-05
  • 打赏
  • 举报
回复
如果用互斥锁的话, 肯能会丢失数据吧?
刀刀亮 2011-12-05
  • 打赏
  • 举报
回复
个人觉得takeFirst()比较好。
whyboysa 2011-12-05
  • 打赏
  • 举报
回复
楼主可以用QT里的信号量来解决, 这个与“生产者消费者”问题有些类似。 这样做可以通过按键控制线程的循环读,然后在分线程中判断信号量,再往外发。 这样在发之前,写进qlist里的东西也不会被冲洗。
信号量类是QSemaphore类。
youhao1999 2011-12-05
  • 打赏
  • 举报
回复
修改如下是否可以?

全局变量
bool flag_start;//开始转发标志
QReadWriteLock lock;
主线程接收:

if(flag_start)
{
lock.lockForWrite();
m_zfList.push_back(m_dataNew.T);
lock.unlock();
}

分线程转发:
while(flag_start)
{
char buf[25];
int b = 10;
lock.lockForRead();
if(!m_zfList.isEmpty())
{
float temp = m_zfList.takeLast();
gcvt(temp,b,buf);
myCom_288->write("t");
myCom_288->write(buf);
}
lock.unlock();
}
刀刀亮 2011-12-05
  • 打赏
  • 举报
回复
楼有没有想过这种情况:
1.你接收数据就在主线程把数据插入到List最后面。在分线程取出list最后的数据进行转发。如果某些情况导致主线程与分线程“不同步了”,会不会出现永远都会有这么几个数据在List头上没法转发。就像是压在栈底。
2.参考楼上的建议。主线程边读取分线程边修改会出现问题。
个人见解……
zhh_kv 2011-12-05
  • 打赏
  • 举报
回复
疑问:接收数据和转发数据都是无限循环吗?

建议:
使用QMutex对全局QList变量进行保护
whyboysa 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 youhao1999 的回复:]
为什么呢?

引用 6 楼 whyboysa 的回复:
如果用互斥锁的话, 肯能会丢失数据吧?
[/Quote]

如果主线程释放锁的时候,分线程没有获得锁的话, 主线程会继续锁住,如果有数据的话会刷掉得。类似分线程也同理,会多次发送相同的数据。
youhao1999 2011-12-05
  • 打赏
  • 举报
回复
从头部取,不会丢失数据吗?[Quote=引用 5 楼 xiaoliang_1 的回复:]
个人觉得takeFirst()比较好。
[/Quote]
youhao1999 2011-12-05
  • 打赏
  • 举报
回复
为什么呢?[Quote=引用 6 楼 whyboysa 的回复:]
如果用互斥锁的话, 肯能会丢失数据吧?
[/Quote]

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧