Thanks Roberto for your efforts.
I have to read the document carefully. A quicklook (and my insight) is not sufficient for selecting the best approach.
From your proposed solution, I get the idea the moving the toplevel panel is only possible if its SystemEvents are processed. Something like its own 'RunUserInterface'. Maybe a single 'ProcessSystemEvents' in the network variable update callback is sufficient. Or a timer-control that executes ProcessSystemEvents with a few Hz. Soon I will give this a try.
Meanwhile, I have used a variation on your proposed solution. Because the data update is low (typical less than once per 5 seconds) I have inserted in the reader a PostDeferredCall in the network variable update callback. This deferred callback runs in the main thread.
In the deferred callback, I create the display panel and retrieve the newest data from the network variable engine. I am not sure yet which of the two functions is the better choice: CNVGetConnectionAttribute (nvhandle, CNVMostRecentDataAttribute, &nvdata) or CNVRead (nvhandle, 2000, &nvdata).
I just build a test where the publisher is a BufferedWriter and where I use CNVGetConnectionAttribute (nvhandle, CNVMostRecentDataAttribute, &nvdata) to retrieve data. I seems to work.
Of course I have to read in detail the document you referred to. And of course I do not know what will happen when I read the data much later, just when the writer sends a new update. But meanwhile, I have a working version.
Regards, Jos