<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Nyall, thanks for the tip.</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Doing a </div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
self.layer.moveToThread(QCoreApplication.instance().thread()) </div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
as the last step in QgsTask.run() worked for me.<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Regards,</div>
<div style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Tej</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Nyall Dawson <nyall.dawson@gmail.com><br>
<b>Sent:</b> Friday, March 8, 2019 7:10 AM<br>
<b>To:</b> Tejas L<br>
<b>Cc:</b> qgis-developer@lists.osgeo.org<br>
<b>Subject:</b> Re: [QGIS-Developer] Any gotchas related to working with QgsVectorLayer inside a QgsTask?</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">On Wed, 6 Mar 2019 at 02:56, Tejas L <tejvan@live.com> wrote:<br>
><br>
> Hello Team,<br>
><br>
> I know that the UI must not be updated from the QgsTask.run() method. Are there any similar restrictions on loading QgsVectorLayer from a file or creating new layers from QgsTask.run() ?<br>
<br>
Some. For a start, you CAN'T utilise a map layer (or its data<br>
provider) created in the main thread in a background thread safely.<br>
(This applies to all layer methods, not just edits/etc). But if you<br>
create a NEW layer within a thread, you should be fine to utilise that<br>
layer WITHIN that thread.<br>
<br>
Now - the complexity comes if you want to "hand back" that layer to<br>
the main thread when you're done with using it in the task (e.g. to<br>
add to the QgsProject, which belongs in the main thread). You need to<br>
first push the layer from the background thread into the main thread,<br>
and then when you're back in the main thread you can take this layer<br>
and add it to your project. Something like:<br>
<br>
from background thread:<br>
<br>
layer.pushToThread( QCoreApplication.thread() )<br>
# don't do ANYTHING else with this layer in the background thread now!<br>
<br>
<br>
when back in main thread:<br>
QgsProject.instance().addMapLayer(layer)<br>
...<br>
<br>
Note that this same principal applies to all QObject subclasses, and<br>
that you CANNOT "pull" an object from a different thread to the<br>
current thread (i.e. you can PUSH from the current thread to another<br>
thread, but you MUST be within that thread. You can't just snatch an<br>
object from a different thread and try to push it to the current<br>
thread).<br>
<br>
Nyall<br>
<br>
><br>
> I find that some operations on a GPKG layer do not work as expected when run from a QgsTask.<br>
> These operations work fine when they are done from a foreground thread.<br>
><br>
> Example:<br>
><br>
> class MyTask(QgsTask)<br>
> ...<br>
> def run(self):<br>
>    self.layer = QgsVectorLayer("geom.gpkg", "test_geom", "ogr")<br>
><br>
> def finished(self, res):<br>
>    if self.layer.isValid():<br>
>        QgsProject.instance().addMapLayer(self.layer)    # Layer loads, but attribute table is not editable<br>
><br>
> --------------------------<br>
> On the other hand, the following works just as expected. The attribute table is editable.<br>
><br>
> layer = QgsVectorLayer("geom.gpkg", "test_geom", "ogr")<br>
> QgsProject.instance().addMapLayer(layer)   # Layer loads and attribute table is editable.<br>
><br>
> What are the best practices for working with a QgsVectorLayer from within a QgsTask?<br>
><br>
> Regards,<br>
> Tej<br>
><br>
><br>
><br>
><br>
> _______________________________________________<br>
> QGIS-Developer mailing list<br>
> QGIS-Developer@lists.osgeo.org<br>
> List info: <a href="https://lists.osgeo.org/mailman/listinfo/qgis-developer">https://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
> Unsubscribe: <a href="https://lists.osgeo.org/mailman/listinfo/qgis-developer">
https://lists.osgeo.org/mailman/listinfo/qgis-developer</a><br>
</div>
</span></font></div>
</body>
</html>