<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Dear all,<br><div><br></div><div>I made an action processed in another thread in QML, and I would like your review.</div><div><br></div><div>When in QML, I click on a button, I send a signal to an object "TaskProcessor" (declared in QML) to start the action.</div><div>Within this slot I start a future with QtConcurrent.</div><div><br></div><div>Before I was using QFutureWatcher to know when the future is finished, but I observed a delay of 1 seconde if the future was taking 4 secondes to complete.</div><div>so now I use one object ("TaskNotifier") instantiated in the concurrent lambda, that connect to "this", and trigger a message to "TaskProcessor" when it finishes.</div><div>TaskProcessor then triggers a signal to QML with the result.</div><div><br></div><div>Is this approach good? I was wondering if this is really the way to follow</div><div>Do you use another approach?</div><div><br></div><div>in QML:</div><div><br></div><div><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><pre style="margin-top:0px;margin-bottom:0px"><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(128,0,128)">Button</span><span style="color:rgb(192,192,192)"> </span>{</pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">    </span><span style="color:rgb(128,0,0)">id</span>:<span style="color:rgb(192,192,192)"> </span><span style="font-style:italic">btnStart</span></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">    </span><span style="color:rgb(128,0,0)">text</span>:<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)">"Start"</span></pre><pre style="margin-top:0px;margin-bottom:0px"><br></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">    </span><span style="color:rgb(128,0,0)">onClicked</span>:<span style="color:rgb(192,192,192)"> </span>{</pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        </span><span style="font-style:italic">output</span>.text<span style="color:rgb(192,192,192)"> </span>=<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,128,0)">"computing..."</span></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        </span><span style="font-style:italic">taskc</span>.doCalculation(<span style="font-style:italic;color:rgb(0,85,175)">Number</span>(<span style="font-style:italic">p1</span>.text),<span style="font-style:italic;color:rgb(0,85,175)">Number</span>(<span style="font-style:italic">p2</span>.text))</pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        </span><span style="font-style:italic">enabled</span><span style="color:rgb(192,192,192)"> </span>=<span style="color:rgb(192,192,192)"> </span>false</pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">    </span>}</pre><pre style="margin-top:0px;margin-bottom:0px">}</pre></pre><pre style="margin-top:0px;margin-bottom:0px"><br></pre></pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(128,0,128)">TaskComputer</span><span style="color:rgb(192,192,192)"> </span>{</pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">    </span><span style="color:rgb(128,0,0)">id</span>:<span style="color:rgb(192,192,192)"> </span><span style="font-style:italic">taskc</span></pre><pre style="margin-top:0px;margin-bottom:0px"><br></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">    </span><span style="color:rgb(128,0,0)">onCalculationFinished</span>:<span style="color:rgb(192,192,192)"> </span>{</pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        </span><span style="font-style:italic">btnStart</span>.enabled<span style="color:rgb(192,192,192)"> </span>=<span style="color:rgb(192,192,192)"> </span>true</pre><pre style="margin-top:0px;margin-bottom:0px"><br></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        <i>// do something with rs</i></span></pre><pre style="margin-top:0px;margin-bottom:0px"><span style="font-family:Arial,Helvetica,sans-serif;color:rgb(192,192,192)">        </span><span style="font-family:Arial,Helvetica,sans-serif">}</span><br></pre><pre style="margin-top:0px;margin-bottom:0px"><br></pre><pre style="margin-top:0px;margin-bottom:0px">}</pre></pre></div><div><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre></div><div>in C++:</div><div><br></div><div><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><span style="color:rgb(128,128,0)">void</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,0,128)">TaskComputer</span>::<span style="font-weight:600;color:rgb(0,103,124)">doCalculation</span>(<span style="color:rgb(128,128,0)">int</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(9,46,100)">p1</span>,<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,128,0)">int</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(9,46,100)">p2</span>)</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px">{</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">    </span><span style="color:rgb(128,0,128)">QFuture</span><<span style="color:rgb(128,128,0)">void</span>><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(9,46,100)">f1</span><span style="color:rgb(192,192,192)"> </span>=<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,0,128)">QtConcurrent</span>::<span style="color:rgb(0,103,124)">run</span>(<span style="color:rgb(192,192,192)"> </span>[<span style="color:rgb(128,128,0)">this</span>,<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(9,46,100)">p1</span>,<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(9,46,100)">p2</span>]()<span style="color:rgb(192,192,192)"> </span>-><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,128,0)">int</span><span style="color:rgb(192,192,192)"> </span>{</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        </span><span style="color:rgb(128,0,128)">TaskNotifier</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(9,46,100)">tnotifier</span>;</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        </span><span style="color:rgb(0,103,124)">connect</span>(&<span style="color:rgb(9,46,100)">tnotifier</span>,<span style="color:rgb(192,192,192)"> </span>&<span style="color:rgb(128,0,128)">TaskNotifier</span>::<span style="color:rgb(0,103,124)">finished</span>,<span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,128,0)">this</span>,<span style="color:rgb(192,192,192)"> </span>&<span style="color:rgb(128,0,128)">TaskComputer</span>::<span style="color:rgb(0,103,124)">futureFinished</span>);</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre><pre style="margin-top:0px;margin-bottom:0px"><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        </span><font color="#800080">// do the task</font></pre></pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre><pre style="margin-top:0px;margin-bottom:0px"><pre style="margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        </span><span style="color:rgb(128,0,128)">TaskResult</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(9,46,100)">tres</span><font color="#000000">(/*</font><font color="#092e64">...my results...*/</font><font color="#000000">);</font></pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">        </span><span style="color:rgb(0,0,128)">emit</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(9,46,100)">tnotifier</span>.<span style="color:rgb(0,103,124)">finished</span>(<span style="color:rgb(9,46,100)">tres</span>);</pre><pre style="margin-top:0px;margin-bottom:0px"><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">    </span>}<span style="color:rgb(192,192,192)"> </span>);</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px">}</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre><pre style="margin-top:0px;margin-bottom:0px"><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><span style="color:rgb(128,128,0)">void</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(128,0,128)">TaskComputer</span>::<span style="font-weight:600;color:rgb(0,103,124)">futureFinished</span>(<span style="color:rgb(128,0,128)">TaskResult</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(9,46,100)">rs</span>)</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px">{</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px">    // do some stuff</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><span style="color:rgb(192,192,192)">    </span><span style="color:rgb(0,0,128)">emit</span><span style="color:rgb(192,192,192)"> </span><span style="color:rgb(0,103,124)">calculationFinished</span>(<span style="color:rgb(9,46,100)">rs</span>);</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px">}</pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre>Best regards,<br>Sylvain<br><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre><pre style="color:rgb(0,0,0);margin-top:0px;margin-bottom:0px"><br></pre></pre></pre></pre></div></div></div></div></div></div></div></div></div></div></div></div>