From 5197846241dc6af21b08923d56e77a7eaf6f7e72 Mon Sep 17 00:00:00 2001 From: Alex Spataru Date: Mon, 1 Nov 2021 03:20:04 -0600 Subject: [PATCH] Allow users to enable/disable multithreaded frame parsing --- assets/qml/Panes/Setup.qml | 3 +- assets/qml/Panes/SetupPanes/Settings.qml | 19 ++++++++++- assets/translations/de.qm | Bin 40814 -> 40944 bytes assets/translations/de.ts | 8 +++++ assets/translations/en.qm | Bin 23666 -> 23730 bytes assets/translations/en.ts | 4 +++ assets/translations/es.qm | Bin 42114 -> 42234 bytes assets/translations/es.ts | 8 +++++ assets/translations/ru.qm | Bin 40693 -> 40811 bytes assets/translations/ru.ts | 8 +++++ assets/translations/zh.qm | Bin 28799 -> 28877 bytes assets/translations/zh.ts | 8 +++++ src/JSON/Generator.cpp | 40 ++++++++++++++++++----- src/JSON/Generator.h | 8 +++++ 14 files changed, 95 insertions(+), 11 deletions(-) diff --git a/assets/qml/Panes/Setup.qml b/assets/qml/Panes/Setup.qml index db32c68b..e972e94b 100644 --- a/assets/qml/Panes/Setup.qml +++ b/assets/qml/Panes/Setup.qml @@ -109,10 +109,11 @@ Item { // App settings // property alias language: settings.language + property alias tcpPlugins: settings.tcpPlugins property alias endSequence: settings.endSequence property alias startSequence: settings.startSequence - property alias tcpPlugins: settings.tcpPlugins property alias separatorSequence: settings.separatorSequence + property alias multithreadedFrameProcessing: settings.multithreadedFrameProcessing } // diff --git a/assets/qml/Panes/SetupPanes/Settings.qml b/assets/qml/Panes/SetupPanes/Settings.qml index cc44f421..26425445 100644 --- a/assets/qml/Panes/SetupPanes/Settings.qml +++ b/assets/qml/Panes/SetupPanes/Settings.qml @@ -32,10 +32,11 @@ Control { // Access to properties // property alias endSequence: _endSequence.text + property alias tcpPlugins: _tcpPlugins.checked property alias language: _langCombo.currentIndex property alias startSequence: _startSequence.text - property alias tcpPlugins: _tcpPlugins.checked property alias separatorSequence: _separatorSequence.text + property alias multithreadedFrameProcessing: _multithreadedFrameProcessing.checked // // Layout @@ -149,6 +150,22 @@ Control { } } + // + // Multi-threaded frame processing + // + Label { + text: qsTr("Multithreaded frame parsing") + ": " + } Switch { + id: _multithreadedFrameProcessing + Layout.leftMargin: -app.spacing + Layout.alignment: Qt.AlignLeft + checked: Cpp_JSON_Generator.processFramesInSeparateThread + onCheckedChanged: { + if (checked != Cpp_JSON_Generator.processFramesInSeparateThread) + Cpp_JSON_Generator.processFramesInSeparateThread = checked + } + } + // // Plugins enabled // diff --git a/assets/translations/de.qm b/assets/translations/de.qm index 61b3c5c98073e1e381338ff2d3aadc9eb7a4ec40..99eca9c460c8c72c2e35777f3962ec9573f0f537 100644 GIT binary patch delta 799 zcmXYuZAg<*6vzMf?(y04Y{HsZvR-^9QKAsD4>>YY3c^Y(P0Gw97n{z~8FM-$>nW#c zVcI&SeJXl&)Q6-XiO_;x7D^N)AyE`rW)K!peKWi9bm8zj|Nnt=?zwk*n18>=Po}b1 zRGZJc?NPUu(F^HnGf*~e(3fN|QVc0}0XSI>>CQJG(i+wCSzk0BW``+{ZRU|Q>S0xx zZB-~6y$=NJ23xNi>?p?0>N7y*6YTuD643pm@%g;dNp8NI^->>SmUMgtCV!3r<|@qC zT7Zt%^o+mahc{5aDcwG6YHoW3B$`b9Lz~1!=FvM-DvxrSHD#FNlPSQVMU*b(t2ZV8 z#3i8XF@+^p+K@Cp^Z@A2k=|xs0gg;c@25nYm0Jv+%A&ZWu{ZQt3bO&)osh~~^GHw7 z*mpXgu#D?VDW2eR9FWVcpTw(_81zQuiho-FO*Yx3cFN%v6L8`=<;(eLALVnsC1PSo zzMS;|SieIad>aA^`sMqDlVU3e-H=n*ABxMRj;H3z@*JS2z`R%c0aP3`7`aYvbGGG3 z*gX285omW%*j&GAT4`F61XNx$xNk-|-4X?kT~lIb=Zf*`m1`3pfsGMmV7OhZILBc0 zHff6P7*X4T1e^-|=akyj^b%<6r9q{XMaZV+vD36gO>x95UjGE(%C`6lM86GogGU#W zu4eP2TWL_OX1_?Yl(I1jTT=P4h14g|xr+uZ=`2R?EH3t%Y*tMjNxaJ%fYy3)Tir~j zdh2%Hl}mB!4SSbuPkS=3E!Vd1M-dQRLmi2$IW4~RFwuEPUx&2_z=K*eqX9lR(S&;8 zI8lg3;f7En!jGV+dEgZ)fNCtqR-yc;6K+6(II@U^g^jhLnvg%}^LTw;XI0Qs=X37& f1RH7s)n-vwN_?S^$QzjWL@YoNYHxix-k$sy-ro2# delta 611 zcmXBQUr1AN6bJD0``x>Hckf1HOExBJw_Y6j;1qI;iuNF6M5G|iTu94kixmp}aY(l1 z{#t78dMJayB_k*F(1TD!*aVY`MWa8oy+r@$&x5!SdnwE=+@}xc!1r*@`Bk8+PiV$Y z?#Pmvj!(&Mson>xmQMfH?PHC6_8ZU$iDGq8`U0CBAxZ6n*{XJNvjha9G{JWh~6 zLwp6gi;Dn#M%7reYN`yr;0=I==ipmu0f?-kM9nlki*9#0nXW#B@9XaX_yBAe zh5*ujEYbHg`U>-m!xrZo~7z`Ul8M($xr z<0J$(H5M|27S1Vb;le|VGSQ3eT$>Q$rf+sC)gR1q=Gs)2EB>niI2uwtIm(q^tSN6w zV2SIpcJlsXy8*7h=0lRw?YXQPZ$=OA60dCV#WxoL5?PG${p12xd5h4box8PFxu%E) zt%dAGhc;^M5EADQKwej!>=VWY-YPj87PMVNK#Sn9)`~syG=TS;c;fF)fCH_nsYdJ< z%ru$9wBVx23KoPQxr7d}i})}q+Udv)W);$3upl}}BmNMb#E%x8By{K>lk>_4f1^j| vCK?Ruyma&_mUQ=xCPQyhx%$XH!Rendering engine Rendering Motor + + Threaded frame parsing + Analyse von Multithreading-Rahmen + + + Multithreaded frame parsing + Analyse von Multithreading-Rahmen + Setup diff --git a/assets/translations/en.qm b/assets/translations/en.qm index 4299424fb126b61030cc34b9f177a212fc2e7862..1549f97fe2a556d1881bb6d86eef91e0c3691a28 100644 GIT binary patch delta 704 zcmXZaTS!xJ90&04|Lp8+=WH?5YOG{OlUhP}3Fc4(19kJd83mderZ_K^8s3&6j6y4< z$n{I@K}yq7f-DkT5{6hY&<804dq|8{RuB|Y1cBI*)6<9F%lCKTxBiqpnP$CKHXe}8 z>_WgH$M=B0-vK1IyHYvl^9bVs|7%ZjCt zHqo*olo>t)3CpVXbm7ESoi#)zAwhD-2)<5@(xil3f-AN}xZQtLspf^zq>n&cuMk{m z1#IcUY~dP^^Nk(}J2{t;LPD`+Nq4d=OS;VRGmkVxMl|O&j2PNIqRt zYKgu*E)qESS2cA~f3q_H=OATE0<@W0ZC?46qIc23av_s$}LR>tCS-cpRpF@Rm|itq;LiC)MO}TAbSmfGV>Nczx8PW^VECZpKLl6gH z2ol(K$cn%jX)}Vr{GyaB2nks=NW;E_g|G~Q(Woe*?19^-ALqb%IOqR7p2f-xUbo>` zT2(NV_NvZS5bpN^xOZxLMl=KGL72P?&@vCgY#AUhluiXW|Ht%;BpxImMleXj78Ls?O=PKkxT)c~$znzawa<%J51Xo-qq%z8(E z`eZ%Z*{Z*wvhF^QX5bRendering engine + + Multithreaded frame parsing + + Setup diff --git a/assets/translations/es.qm b/assets/translations/es.qm index d3bfdeec4fd69c4491caac0c28545ba1588be57e..85a6c5a2ea8e8882e24f383e013d49926f76ef5c 100644 GIT binary patch delta 767 zcmXYtZAepL7>4in?0B}b4ThG9Mjo?pIATRn6a67UX<1?rD5+_yO{Xo*IUR-|smrgG ztw%S18KtH8BP)N55+kq}en6qo2Vqv0N=A`HL=<)E^uqmI+`Moo|(=Tcl(c`0I5*p-G{mTw%*R_`xeccNzFQpMh4rzafM3M*G7a)=cRvhYeFFD>1bR zI5Kq~sCuKYWrISWi2TxSz%-5gk2`^;8Irgd_JJ&1F?&TpE-9)r5{qA-0P1P{GSmaU zUV6kmW0N$XGDf~s)ipl^^cK~?Se86SEX}Lpxj+>CRwb*$i!nfB1sVBF@iy;R=mY#$ z$-|oyy=naOv2lRR{M@cQ%s{2b3vfB(~%Vy@A7WN1M>U?JcnP zu@IVb0|)bj``L>?$1DvCF|3`!LSF2M`dC3K(3PVumsWw|6@{%k$fCB0@6}T?H9*@a zdDIoD-s76uO;Ny!e1(-EO;^1ixZu+a_N92r#`PFS9_U?-MJd>g3cP_6WvKqA1e`*R?A@|+ z$a10*39!K~S2tX+%KuhWYal;C*81!kr@PGUaM`UkyDg!_Wj$q2IBj)RmsOOGZ0;fs delta 609 zcmXBPUr1AN6bJC{@3*^qckc#6vo4G9LJto2up+d9J&X!QSYTjit->;zqM&5hvZRsC z%|9cZr_F-UENu3W5JJ))TO?v@gFy+_Ls$eBB?#h6f9=A3IUmk}^Y2%NcV+lsF}oAj zw(y}u+@qCp2=_aH6E4HXCc|hego!cW#!m=OR)Og4c*w`Yo87$k5p9@N zCXy=dkW0j1r%4}pgsMcJ5?K~UlGS>;PNSmgI3s5N6#@Pc!@!)lm{|jQwo+cKb?lc; z9j^drNovycYTXaR=q!09kK8V0-?jt22Pq`A@bDU~N~*lgGI4X0{>?PmEh?)drzPYF z$l*2ul79?`ugI|r@AM_FDQ&6Yebc1MUPnwh86N?Trj^sb%YXy(hJD|uRaRLwMP(0* zP+D$aSIMc=GJ!&h#)34e6!X|)N-IuQL0=U&?|M$ERg)FlGj<+`Tqdv8!x#mvHGJ?X o<*k#2{R{T`ZvE?;H}>YW!$9H#4cPYZ;pwTIt*vWna^TSB|DeLniU0rr diff --git a/assets/translations/es.ts b/assets/translations/es.ts index d9dc3e09..ef75184b 100644 --- a/assets/translations/es.ts +++ b/assets/translations/es.ts @@ -2112,6 +2112,14 @@ Rendering engine Motor de renderizado + + Threaded frame parsing + Análisis multihilo de tramas + + + Multithreaded frame parsing + Análisis multihilo de tramas + Setup diff --git a/assets/translations/ru.qm b/assets/translations/ru.qm index c5043db6ac9c6e6cc9b7160f6cf80445d6d57e2e..961c8a656ecd9b405587a207317fbdac0a59cce2 100644 GIT binary patch delta 770 zcmXAldq|T}7{=docJ^)iCX8$}(AZ~1d4W{2oLZ?QsVJgotn!jso0rTCZ$nV$ZO(?b z&(~7_Nu!HabOHZZ7c`?{h(usvVu+DtkwIYv5k#H%4m|wc=Wux5_dP!+>Dm(Xur*VmTLrl#=K(?&A@|E30A~nF)I=80LXXj=L>#2S8+@?(;}w7=5&jq& z0NfsYL0^;KIHua+-(^?Tw?6~W539x|)A$&TxU7;$4gOVyYJ96EfW|otX31i&nU$_w z2IvY$2MgcYT*ekAp8#}^vZd&&04)RT?I)fS^<1GmiasWhPW;H~Xpa#K)e>1lr`k+= zvT;NmOqS564i9jtg*^QS{woCvPreZf{(I*=Gzby8UxK4S#hb)nijcCUS-5y1hr0#g zO5{6$q(#BIR0EK9P?*kG1?ZT;JA#Sypii&{cycty^Wp${yqZ(eIzav{g>9K=(L{?a z+cmRuwE*qI=+IQg_G|05`2!TrD=bItK!Xf$&Z-?B+Q@glslBoC9w61Cy*uUNOAaZN z!%)&T1@y(~+N%&iUQpO?)pgaqlb!KCxZc{)_3^hol;y zH4rU&3t7QR{bBL|efrz}?r6gaml5C)HI%Ps0rXu*x8FX}J@M3UzA-6)^d(kgqA&29@St}3dq S2c0ddsxCWIGSTU&F#ZD@Ao7j? delta 616 zcmXZYT}V@L7zXg?|KHg;J7>bm#6v@NBEn&TmX(9P>?R`#3@lAoQ4%dyArvZtx}2M< zrf!Efvo6vin%)?K7m;NXBCIq<_F)K7mX%N>Nz#Rs9XMV6;DwjxdEajj`NA-dyVwm~ zQ<0smIUqQs2a0&$wLV(M8mN$!uu_UKUrrDe zV;+UHJ69F zXvwOwVp7FC`I1=IU;)~mQHi))P8Ykclo|nk>JinIUUBSi22fsQTJ=Jld^!)btfG`y z=Dhe>I_lj5bnKD*nlV1qZyKDYLa9JGe^(ltr~yLjC?Hj{H8dw>Di>yLeOFf)aofpZ z%jEF~Rendering engine Механизм рендеринга + + Threaded frame parsing + Многопоточный анализ кадров + + + Multithreaded frame parsing + Многопоточный анализ кадров + Setup diff --git a/assets/translations/zh.qm b/assets/translations/zh.qm index 872af9ba2646c9f50bdd55be6b022931c5a0b404..1686a02cf287bb0e954d7b226b35a87822064e83 100644 GIT binary patch delta 723 zcmXZaT}YEr7zgm@ynFY4Z00acZNgr)i@A%^qMB$~^x?`9%g}vgZgX?f%4ANLG4w{U z3n9mo8byhkO@gqJ8d0WEu|%vW!4OT$GB2V+g|5urcsp>;k8|_?KL^g*92x&a+BBp; zD8y4XRZuVJegS=}9$;6RP?MwsLo#iQK~~@N5`gWNg@*FPA-Zr@CJ+y<$#iUFAwkTGLoIFKZM0{;7oao| z{d9WDGW}ubIe;yPp4r(4V0=Z-Es80rf@Ik~jL-rp#Ba2pT*XqkhB6UslndlFcFDEm z8Ajw=)Ru#cRrwVldsK4&J*MQ}z1V>&CY}Go_yaPr@go`-LyC{N(Q!g-tYmIxdN;Fvg9)S(`OWe9JnvQdk1W2}zn`QP1jmKRfoW7Qn)y zpRLL=CUSL~)&uOFl03YDyBr7tlpNyvuf&S=_1x|GF8~?C+})?m04Yn7j%gIQ2DKxT zZ}K8QS@nM>_}04j0OtD`=8R+&ReTOrti}R9UTsZNI6dtw~(T*)q*_4wEzKBXJ+8%9IHw<4;dUD+l3mJDC2jXJHos?gD k##iCWCejvG+v(1(;Uk761SM delta 603 zcmXZYUq};i902g|_wIJLyBm#>bh*N#5v}>)`s+f&QN#paCe*skrTZhas7NTmju9E%Qkev5mkYe8?EGLPBK8WC`{XSwi^`3`P$@f7ZeE^83J#@Bfw0Sl__=P53yg z?qDLzS&!;^3fz-HfaCiOPdN;Ow}Hz~0mQPvy{ZBP^VxJKX0l63CR!se`mvWrG2!w- zsPr13YsN4r8-@pqGNyWRAGdb}Fl}#;7s7`g0g1brK z-Qql-8e;W|@+}hFHQ1F;|ad>w*jDipW(?mzrI`p2mzIOt?`8r4Y%pB zOTtA}|Lw>b23N={c*KK3sd8P9eM4#C3UjtXRY4IMbAEig-s~`0%?gf@(|pq&tBJ!` z3826Eza!$kzG`)CQQgN0h^|zIZk`vF-H_44YQe;&;WGUb^{eGL|l|2}vl&oQr%JOsD18e+_ fzVoqF>!n&ZK-^EGmUgDUF!#=~Gcea2pWgNlH>|(> diff --git a/assets/translations/zh.ts b/assets/translations/zh.ts index 20926950..98de7030 100644 --- a/assets/translations/zh.ts +++ b/assets/translations/zh.ts @@ -2044,6 +2044,14 @@ Rendering engine 渲染引擎 + + Threaded frame parsing + 多线程框架分析 + + + Multithreaded frame parsing + 多线程框架分析 + Setup diff --git a/src/JSON/Generator.cpp b/src/JSON/Generator.cpp index 93a2d7a0..d0235596 100644 --- a/src/JSON/Generator.cpp +++ b/src/JSON/Generator.cpp @@ -45,6 +45,7 @@ static Generator *INSTANCE = nullptr; Generator::Generator() : m_frameCount(0) , m_opMode(kAutomatic) + , m_processInSeparateThread(false) { auto io = IO::Manager::getInstance(); auto cp = CSV::Player::getInstance(); @@ -110,6 +111,13 @@ Generator::OperationMode Generator::operationMode() const return m_opMode; } +/** + * Returns @c true if JSON frames shall be generated in a separate thread + */ +bool Generator::processFramesInSeparateThread() const { + return m_processInSeparateThread; +} + /** * Creates a file dialog & lets the user select the JSON file map */ @@ -202,6 +210,14 @@ void Generator::setOperationMode(const JSON::Generator::OperationMode mode) emit operationModeChanged(); } +/** + * Enables or disables multi-threaded frame processing + */ +void Generator::setProcessFramesInSeparateThread(const bool threaded) { + m_processInSeparateThread = threaded; + emit processFramesInSeparateThreadChanged(); +} + /** * Loads the last saved JSON map file (if any) */ @@ -285,15 +301,21 @@ void Generator::readData(const QByteArray &data) m_frameCount++; // Create new worker thread to read JSON data - QThread *thread = new QThread; - JSONWorker *worker = new JSONWorker(data, m_frameCount, QDateTime::currentDateTime()); - worker->moveToThread(thread); - connect(thread, SIGNAL(started()), worker, SLOT(process())); - connect(worker, SIGNAL(finished()), thread, SLOT(quit())); - connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater())); - connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); - connect(worker, &JSONWorker::jsonReady, this, &Generator::loadJFI); - thread->start(); + if (processFramesInSeparateThread()) { + QThread *thread = new QThread; + JSONWorker *worker = new JSONWorker(data, m_frameCount, QDateTime::currentDateTime()); + worker->moveToThread(thread); + connect(thread, SIGNAL(started()), worker, SLOT(process())); + connect(worker, SIGNAL(finished()), thread, SLOT(quit())); + connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater())); + connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); + connect(worker, &JSONWorker::jsonReady, this, &Generator::loadJFI); + thread->start(); + } + + // Process frames in main thread + else + processFrame(data, m_frameCount, QDateTime::currentDateTime()); } /** diff --git a/src/JSON/Generator.h b/src/JSON/Generator.h index 56eeca6d..f483a34e 100644 --- a/src/JSON/Generator.h +++ b/src/JSON/Generator.h @@ -103,12 +103,17 @@ class Generator : public QObject READ operationMode WRITE setOperationMode NOTIFY operationModeChanged) + Q_PROPERTY(bool processFramesInSeparateThread + READ processFramesInSeparateThread + WRITE setProcessFramesInSeparateThread + NOTIFY processFramesInSeparateThreadChanged) // clang-format on signals: void jsonFileMapChanged(); void operationModeChanged(); void jsonChanged(const JFI_Object &info); + void processFramesInSeparateThreadChanged(); public: enum OperationMode @@ -125,10 +130,12 @@ public: QString jsonMapFilename() const; QString jsonMapFilepath() const; OperationMode operationMode() const; + bool processFramesInSeparateThread() const; public slots: void loadJsonMap(); void loadJsonMap(const QString &path); + void setProcessFramesInSeparateThread(const bool threaded); void setOperationMode(const JSON::Generator::OperationMode mode); private: @@ -152,6 +159,7 @@ private: QSettings m_settings; QString m_jsonMapData; OperationMode m_opMode; + bool m_processInSeparateThread; }; }