仅从 C++ API 进行异步调用,Qt 网络通道迁移看起来是不可能的

Posted

技术标签:

【中文标题】仅从 C++ API 进行异步调用,Qt 网络通道迁移看起来是不可能的【英文标题】:Qt webchannel migration looks impossible with only asynchronous call from C++ API 【发布时间】:2021-06-01 23:34:25 【问题描述】:

我正在使用带有 html 的 c++ 应用程序。

使用 webkit,我们可以从 c++ 对象同步调用 c++ API。 javascript中的逻辑很清楚。

但是,对于 WebChannel,来自 c++ 对象的每个 API 调用都是异步的。如果我们从异步调用中获得一个对象-B 作为返回值,那么来自对象-B 的 API 调用也是异步的。这不仅大大增加了代码复杂度,而且逻辑也难以维护。

考虑这段代码:

new QWebChannel(qt.webChannelTransport, function (Channel) 
    var jsObject = Channel.objects.external;
    jsObject.RegisterClient("clientname", 0, function(Handle) 
        jsObject.ConfigureClient(Handle, function (clientObject) 
            clientObject.getItems(function (items) 
                for (int i = 0; i < items.size(); i++)
                
                    items[i].calculateValue1(function (value) 
                        **// update value. Here value of 'i' will be out of over 'item.size()'.**
                        items[i].calculateValue2(function (value) 
                            // update value
                        );
                    );
                
        );
    ); // this is asynchronous
);

首先,从 webkit 迁移现有代码的工作量太大。其次,如以粗体突出显示的那样,for 循环已中断。

是否有替代解决方案? QT5.15及以上版本除了webchannel还有什么可以用的吗?

【问题讨论】:

【参考方案1】:

已联系 QT 支持,遗憾的是没有解决此问题的方法。所有对 webchannel 的 c++ API 调用都在另一个进程中处理,因此不可能像 webkit 那样同步。

【讨论】:

以上是关于仅从 C++ API 进行异步调用,Qt 网络通道迁移看起来是不可能的的主要内容,如果未能解决你的问题,请参考以下文章

错误:仅从 Android O (--min-api 26) 开始支持调用自定义

C++ 可执行文件仅从 Visual Studio 启动

QT 异步函数转为同步函数的方法

异步调用future/promise模式(C++版本)

使用 C++、Qt 进行亮度、对比度、伽玛调整

QT C++,如何在在一个CPP里直接调用到另一个CPP里的函数