Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. Problem with WorkerScript and list model of a ListView
Forum Updated to NodeBB v4.3 + New Features

Problem with WorkerScript and list model of a ListView

Scheduled Pinned Locked Moved QML and Qt Quick
1 Posts 1 Posters 571 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    sk2212
    wrote on last edited by sk2212
    #1

    Edit: Did not know how to format the code?!

    I have a WorkerScript which gets content from a AJAX-Call and print the processed content into a list model of the ListView. The ListView is like a file browser where you can click on a folder and get the content of the clicked folder. The content is read blockwise:

    <code>

    WorkerScript.onMessage = function(message) {

    if(message.method === "searchContainerEntries") {

            var ip = message.ip;
            var session = message.session;
            var debug = true;
    
            if(message.start === 0) {
                message.model.clear();
                //message.model.sync();
            }
            xhr = new XMLHttpRequest;
    
            xhr.open("POST", "http://"+ip+":8080", true);
            xhr.onreadystatechange  = function() {
    
                if (xhr.readyState == XMLHttpRequest.DONE) {
    
                    var response = xhr.responseText;
                    var objectArray = parseJSONString(response, "$.result[*]")
                    var mediaType = "";
    
                    for(var i=0;i<objectArray.length;i++) {
                        var mediaPath = objectArray[i].mediaPath;
                        var name = objectArray[i].name;
                        if(objectArray[i].mediaType === "directory") {
                            mediaType = "folder";
                        } else if(objectArray[i].mediaType === "item-picture") {
                            mediaType = "picture";
                        } else if(objectArray[i].mediaType === "item-music") {
                            mediaType = "music";
                        } else if(objectArray[i].mediaType === "item-movie") {
                            mediaType = "movie";
                        } else if(objectArray[i].mediaType === "directory-parent") {
                           mediaType = "back";
                        }
    
                        if(mediaType !== "back") {
    
                               message.model.append({"fileType" : mediaType, "name" : name, "iconSource" : "", "mediaPathItem" : mediaPath});
                                
                                //WorkerScript.sendMessage({"listViewInsert" : 'true', "fileType" : mediaType, "name" : name, "iconSource" : ", "mediaPathItem" : mediaPath});
                                message.model.sync();
                        }
                    }
                    // Send message back that we are ready to get further elements of current path
                    if(message.max !== 400) {
                        console.log("Sending next request from Worker Script in same path...")
                        WorkerScript.sendMessage({currentMediaPath: message.mediaPath});
                    }
                }
            }
            xhr.send('{"id":6,"jsonrpc":"2.0","method":"mediaNav_getMediaListContent","params":{"max":'+message.max+',"mediaPath":"'+message.mediaPath+'","sessionId":'+session+',"start":'+message.start+'}}');
    

    }
    </code>

    So, the WorkerScript gets the first 8 elements and send a message back that we can process the next 400 elements:

    WorkerScript {

    id: myWorker
    
    source: "js/searchdevices.js"
    
    // Messages sent FROM WorkerScript
    onMessage: {
           // We got first element block and can read next elements
            myWorker.sendMessage({'max': 400,  'ip' : sessionRefresh.ip, 'session' : sessionRefresh.session,
                                     'mediaPath' : messageObject.currentMediaPath, 'model' : listView1.model,
                                     'method' : 'searchContainerEntries', 'start' : 8});
        }
    }
    

    However, this is working good so far. No GUI blocking and processed elements where appended in list view model

    But there is a problem:

    • Like I wrote the list view acts as a file browser. Clicking on a folder will invoke the WorkerScript which reads the content of the folder blockwise.
    • **BUT NOW ** a user did not wait until the next read block is processed for the clicked folder and click quickly on the next folder. Now the next read content from the parent folder is wrongly appened to the clicked folder.

    Question

    How to fix this? I have no possibility to stop the invoked funtion in the WorkerScript, right? Furthermore I have no possibility to check the appended items against a path within the WorkerScript because I cannot access properties of qml elements.

    1 Reply Last reply
    0

    • Login

    • Login or register to search.
    • First post
      Last post
    0
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Get Qt Extensions
    • Unsolved