<QApplicationStatic>
Header: | #include <QApplicationStatic> |
宏
(since 6.3) | Q_APPLICATION_STATIC(Type, VariableName, ...) |
宏文档
[since 6.3]
Q_APPLICATION_STATIC(Type, VariableName, ...)
该宏扩展了Q_GLOBAL_STATIC ,并创建了一个类型为QGlobalStatic 的全局静态对象,其名称为VariableName ,由变量参数初始化,并作为指向Type 的指针,该类型的实际生命周期与QCoreApplication 绑定。由 Q_APPLICATION_STATIC 创建的对象会在首次使用时进行初始化,这意味着它不会增加应用程序或库的加载时间。此外,该对象在所有平台上都是以线程安全的方式初始化的。
与Q_GLOBAL_STATIC 只在程序退出时销毁类型不同,这里类型的实际生命周期与QCoreApplication 的生命周期绑定。这使它成为存储半静态 QObjects 的理想选择,一旦QCoreApplication 销毁,QObjects 也应随之销毁。这意味着一旦QCoreApplication 发出销毁信号,该类型就会被删除。如果同时创建了一个新的QCoreApplication ,则允许在再次访问该对象时重新创建。
由于该值与QCoreApplication 绑定,因此只有在存在有效的QCoreApplication::instance() 时才能访问该值。在QCoreApplication 创建之前或销毁之后访问该对象将产生警告,并可能产生不可预测的行为。
在全局上下文中(即在任何函数体之外),该宏的典型用法如下:
Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())
请注意,每次构建对象时,都会对以变量方式传递给该宏的参数进行评估,因此在上述示例中,如果对象被重新创建,函数function
将被调用不止一次。
除了值也与QCoreApplication 的生命周期绑定外,该宏的行为与Q_GLOBAL_STATIC() 相同。更多信息,请参阅该宏的文档。
线程保证
Q_APPLICATION_STATIC 宏确保对象只被初始化一次(每个QCoreApplication 的生命周期),即使多个线程试图并发访问该对象。这是通过为每个对象提供一个互斥项来实现的;应用程序和库的开发人员需要注意,他们的对象在构造时将锁定该互斥项,因此不得再次进入同一对象的初始化,否则将出现死锁。
对象的销毁不存在线程安全问题:一旦QCoreApplication 析构函数开始运行,用户代码不得访问该对象。用户代码必须确保这种情况不会发生,例如,一旦主线程的事件循环退出,就不得访问该对象。
与Q_GLOBAL_STATIC 一样,Q_APPLICATION_STATIC 也没有为创建完成后对对象的访问提供线程安全保证。应由用户代码来确保不会发生不安全的数据访问。
如果此操作创建的对象是QObject ,则其关联线程将是成功创建该对象的线程。它将被主线程销毁,因此建议在销毁前向主线程或无线程发送moveToThread() 。如果不能保证主线程是初始化对象的线程,那么在相关类的构造函数中这样做是一个明智的解决方案。
此宏在 Qt 6.3 中引入。
另请参阅 Q_GLOBAL_STATIC 和QGlobalStatic 。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.