仅从 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 网络通道迁移看起来是不可能的的主要内容,如果未能解决你的问题,请参考以下文章