小编iam*_*man的帖子

将Q_DECLARE_METATYPE与可能多次加载的DLL一起使用

使用Qt 4.8和C++.我正在使用在运行时加载和卸载的应用程序插件.在应用程序的生命周期内,可以多次加载相同的插件.其中一个插件用于Q_DECLARE_METATYPE某些需要存储的类型QVariant.稍后重新加载插件时,旧声明仍指向现在卸载的库的原始内存空间.当Qt尝试QVariant从重新声明的元类型创建a时,这会导致访问冲突.我们已经处理了类似的问题qRegisterMetaType():我们在加载库时注册元类型,并在卸载库之前注销这些类型.不幸的是,在声明而不是注册元类型时,这似乎不是一个选项.

我们如何有效地处理多次加载和卸载声明元类型的库的情况?

c++ qt qt4

6
推荐指数
1
解决办法
949
查看次数

使用动态插件处理 Qt5 中的 QMetaType 注册

我的公司正在考虑从 Qt 4.8.4 跳转到 Qt 5.4,但我遇到了一个对我们来说可能是一个亮点的变化:QMetaType::unregisterType()被删除 ( http://doc.qt.io/qt-5/sourcebreaks.html ) .

我们的 GUI 要求在运行时加载插件,在 GUI 会话期间可能会多次加载和卸载相同的插件。在 Qt 4 中,我们遇到了一个问题,当插件第二次加载时,任何使用插件注册的自定义类型之一的信号/插槽都会导致访问冲突,因为元类型已被注册插件的第一个实例(现在已卸载,因此内存空间无效)。我们通过定义我们自己的宏来解决这个问题,以便在加载和卸载插件时安全地注册和取消注册元类型。

随着QMetaType::unregisterType()不再存在,我担心这个问题会回来与解决问题没有真正的方法。升级到 Qt 5.4 将是一项重大投资,甚至可以达到我可以测试这个问题的程度,所以我希望我能从这里的专家那里得到一些指示。

有没有办法在 Qt 5 中取消注册元类型?如果没有,Qt 5 现在是否有某种系统可以检测 DLL 何时被卸载并取消注册元类型本身(我认为极不可能)?或者,如果我们切换到新的 Qt 5 信号/插槽语法,是否可以完全免除我们对元类型的需求?如果是这样,新语法是否仍然允许排队连接?请原谅我对这个主题的无知,但我没有看到它被明确列为支持或不支持。

c++ qt qt5 qtcore qmetatype

5
推荐指数
1
解决办法
527
查看次数

boost :: accumulators :: rolling_mean返回不正确的平均值

环境:VS 2013,Boost 1.58

我写了一些东西,它为Boost的累加器提供了一个更友好的界面,可用于在窗口上投影和,并计算窗口上的实际滚动平均值.在推动将VS 2013作为我们的主编译器的过程中,该类的一个单元测试开始失败.剥离层,我把它缩小到这个最小的例子:

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <boost/accumulators/statistics/rolling_mean.hpp>

namespace ba = boost::accumulators;
namespace bt = ba::tag;
typedef ba::accumulator_set < uint32_t, ba::stats <bt::rolling_mean > > MeanAccumulator;

int main() {

    MeanAccumulator acc(bt::rolling_window::window_size = 5u);

    for (uint32_t i : { 3, 2, 1, 0 }) {
        acc(i);
        std::cout << i << " actualMean: " << std::fixed << boost::accumulators::rolling_mean(acc) << "\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

在循环的最后一次传递中,我没有得到预期的平均值(1.5),而是得到一个疯狂的高值(1431655766.333333).

此代码在VS 2008中使用Boost 1.49正确执行(显然已替换C++ 11向量初始化),但在VS 2012和VS 2013中使用Boost 1.58失败.我无法解释这种失败,因此无法修复它.

其他有趣的观点:

  • 手动检查累加器内的存储器值表明其循环缓冲区中包含正确的数据.
  • 如果放入累加器的数据按递增值排序,则rolling_mean将是正确的.
  • 一旦窗口已满,如果任何新元素小于它正在敲出窗口的数字,则rolling_mean将不正确.如果它等于或大于,则rolling_mean将是正确的.

它似乎是一个Boost错误,但是想要在报告错误或尝试构建Boost 1.59之前验证我没有做一些愚蠢的事情.提前致谢!

编辑:感谢您的回复,因为这似乎是一个Boost错误.相关的Boost票在这里..这是与带累加器的无符号整数相关的问题.具体来说,如果在窗口已满后添加到累加器的值严格小于窗口中的所有值,则rolling_mean调用将返回无效结果.

有一种解决方法,即不使用带累加器的无符号整数.这解决了我的问题,谢谢你的帮助!

c++ boost boost-accumulators

5
推荐指数
1
解决办法
1248
查看次数

标签 统计

c++ ×3

qt ×2

boost ×1

boost-accumulators ×1

qmetatype ×1

qt4 ×1

qt5 ×1

qtcore ×1