修正多线程

This commit is contained in:
2023-10-29 20:51:17 +08:00
parent 36b28403c7
commit 79ad30262f
7 changed files with 90 additions and 18 deletions
+33 -7
View File
@@ -6,12 +6,16 @@ Parse::Parse(QObject *parent) : QObject(parent)
setAutoDelete(true);
qRegisterMetaType<QList<QByteArray>>("QList<QByteArray>");
qRegisterMetaType<QMap<quint16,QList<QByteArray>>>("QMap<quint16,QList<QByteArray>>");
qRegisterMetaType<QMap<quint32,QMap<quint16,QList<QByteArray>>>>("QMap<quint32,QMap<quint16,QList<QByteArray>>>");
Packer_init(&packer);
Parser_init(&parser);
datagram.clear();
}
Parse::~Parse()
@@ -22,15 +26,20 @@ Parse::~Parse()
void Parse::run()
{
uint64_t all = 0;
uint64_t current = 0;
QElapsedTimer time;
time.start();
qDebug() << "parse thread:" << QThread::currentThreadId();
all = datagram.size();
while (datagram.size() > 0) {
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{
current ++;
uint8_t id = -1;
switch (id = Parser_char(&parser,*i))
{
@@ -81,9 +90,24 @@ void Parse::run()
frame.append((const char)parser.buff[i]);
}
//qDebug() << time << save_count << QHostAddress(ip) << port;
FrameData.append(frame);
if(port_data.contains(port))//包含
{
QList<QByteArray> frame_list = port_data.value(port);
frame_list.append(frame);
port_data.insert(port,frame_list);
}
else//不包含
{
QList<QByteArray> frame_list;
frame_list.append(frame);
port_data.insert(port,frame_list);
}
frame_data.append(frame);
emit progress(all,current);
}
break;
default:
@@ -91,8 +115,8 @@ void Parse::run()
break;
}
}
emit frameList(FrameData);
emit frameList(frame_data);
emit frameport(port_data);
@@ -103,6 +127,9 @@ void Parse::run()
qDebug() << "thread finished, time: " << time.nsecsElapsed() << "ns";
}
//每次读取一个缓存大小的数据
void Parse::parseData(const QString filename)
{
qDebug() << "current thread is:" << QThread::currentThreadId();
@@ -122,8 +149,7 @@ void Parse::parseData(const QString filename)
return;
}
FrameData.clear();
frame_data.clear();
datagram.clear();
datagram.append(file->readAll());
+25 -1
View File
@@ -37,16 +37,40 @@ public slots:
signals:
void progress(uint64_t all,uint64_t current);
void frameList(QList<QByteArray> data);
void frameport(QMap<quint16,QList<QByteArray>> data);
private:
uint32_t cache_size = 1024 * 1024 * 100;//100M大小缓存,使用动态内存申请
QByteArray datagram;
Packer_t packer;
Parser_t parser;
QList<QByteArray> FrameData;
/*===============================
group
ip1 ip2
port1 port2 port3 port1 port2 port3
data data data data data data
=================================*/
QList<QByteArray> frame_data;
QMap<quint16,QList<QByteArray>> port_data;
QMap<quint32,QMap<quint16,QList<QByteArray>>> ip_data;// ip port data
};
+7 -1
View File
@@ -232,8 +232,14 @@ void PlayThread::run()
}
}
void PlayThread::playData(QList<QByteArray> data)
void PlayThread::playData(QList<QByteArray> data,QMap<quint16,QList<QByteArray>> data2)
{
//收到数据后对数据进行分类,重新生成子线程进行解析
port_data.clear();
port_data = data2;
FrameData.clear();
FrameData = data;
+2 -1
View File
@@ -46,7 +46,7 @@ public:
public slots:
void playData(QList<QByteArray> data);
void playData(QList<QByteArray> data, QMap<quint16, QList<QByteArray> > data2);
void setNewPos(int64_t pos)
{
@@ -104,6 +104,7 @@ private:
QList<QByteArray> FrameData;
QMap<quint16,QList<QByteArray>> port_data;
bool isChangedPos = false;
+1
View File
@@ -16,6 +16,7 @@ int main(int argc, char *argv[])
}
qRegisterMetaType<QMap<QDateTime,QByteArray>>("QMap<QDateTime,QByteArray>");
qRegisterMetaType<QMap<quint32,QMap<quint16,QList<QByteArray>>>>("QMap<quint32,QMap<quint16,QList<QByteArray>>>");
qRegisterMetaType<uint64_t>("uint64_t");
qRegisterMetaType<int64_t>("int64_t");
+21 -8
View File
@@ -675,6 +675,15 @@ MainWindow::MainWindow(QWidget *parent)
parse->parseData(filename);
connect(parse,&Parse::progress,this,[=](qint64 length,qint64 current){
if(progressbar)
{
progressbar->setRange(0,length);
progressbar->setValue(current);
}
});
connect(parse,&Parse::frameList,this,[=](QList<QByteArray> data){
playdata.clear();
playdata = data;
@@ -701,6 +710,16 @@ MainWindow::MainWindow(QWidget *parent)
});
connect(parse,&Parse::frameport,this,[=](QMap<quint16,QList<QByteArray>> data){
//playdata.clear();
//playdata = data;
port_data.clear();
port_data = data;
});
QThreadPool::globalInstance()->start(parse);
});
@@ -1067,19 +1086,12 @@ MainWindow::MainWindow(QWidget *parent)
ui->pushButton_play->setStyleSheet(btn_default + btn_hover + btn_pressed);
playthread->setNewPos(value);
qDebug() << "sliderMoved" << value;
}
});
QThreadPool::globalInstance()->start(playthread);
}
MainWindow::~MainWindow()
@@ -1258,8 +1270,9 @@ void MainWindow::on_pushButton_play_clicked()
if(playthread)
{
playthread->playData(playdata);
playthread->playData(playdata,port_data);
port_data.clear();
playdata.clear();
play_state = 0x01;
emit changedPlayState(play_state);
+1
View File
@@ -93,6 +93,7 @@ private:
QList<QByteArray> playdata;
QMap<quint16,QList<QByteArray>> port_data;
uint8_t play_state = 0;//0 停止 1 播放 2 暂停