修正多线程
This commit is contained in:
@@ -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());
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -93,6 +93,7 @@ private:
|
||||
|
||||
|
||||
QList<QByteArray> playdata;
|
||||
QMap<quint16,QList<QByteArray>> port_data;
|
||||
|
||||
|
||||
uint8_t play_state = 0;//0 停止 1 播放 2 暂停
|
||||
|
||||
Reference in New Issue
Block a user