QT中QTimer的循环时间与槽函数执行时间分析,以及在事件循环中触发

news2024/11/24 14:36:46

目录

当循环时间小于槽函数时间时: 

当循环间隔时间大于槽函数时间时:

当存在两个定时器器,其中一个还是间隔100ms,另一个间隔1000ms: 

当两个定时器的循环周期大于槽函数执行时间时

当在主程序中添加一个for循环后 

当在for循环中加上人为触发其他事件QCoreApplication::processEvents() 后

当把for循环放到子线程中运行时 

当在子线程中定义定时器时 


当循环时间小于槽函数时间时: 

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <QThread>
#include <iostream>
#include <QObject>
#include <QTime>

void timer1()
{
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  1" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  2" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  3" << std::endl;
    QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  4" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  5" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  6" << std::endl;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTimer timeTest;
    timeTest.setTimerType(Qt::PreciseTimer);
    QObject::connect(&timeTest, &QTimer::timeout, [=]() {timer1(); });
    
    timeTest.start(100);

    return a.exec();
}

执行结果: 

结果分析:

QTimer 设置的循环时间小于槽函数的执行时间时,当循环时间结束时,并不会将槽函数中断,而是等槽函数运行结束后,直接再次进入,中间没有间隔时间。

当循环间隔时间大于槽函数时间时:

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <QThread>
#include <iostream>
#include <QObject>
#include <QTime>

void timer1()
{
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  1" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  2" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  3" << std::endl;
    QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  4" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  5" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  6" << std::endl;
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTimer timeTest;
    timeTest.setTimerType(Qt::PreciseTimer);
    QObject::connect(&timeTest, &QTimer::timeout, [=]() {timer1(); });
    
    timeTest.start(7000);

    return a.exec();
}

 结果分析:

间隔时间都比较准。每次的间隔时间也不会存在累计误差。

当存在两个定时器器,其中一个还是间隔100ms,另一个间隔1000ms: 

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <QThread>
#include <iostream>
#include <QObject>
#include <QTime>

void timer1()
{
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  1" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  2" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  3" << std::endl;
    QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  4" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  5" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  6" << std::endl;
}

void timer2()
{
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Timer2" << std::endl;
	//QThread::msleep(1000);
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTimer timeTest,timeTest2;
    timeTest.setTimerType(Qt::PreciseTimer);
    timeTest2.setTimerType(Qt::PreciseTimer);
    QObject::connect(&timeTest, &QTimer::timeout, [=]() {timer1(); });
    QObject::connect(&timeTest2, &QTimer::timeout, [=]() {timer2(); });

    timeTest.start(100);
    timeTest2.start(1000);
    return a.exec();
}

结果分析:

第一个100ms的定时器优先抢占触发事件,当执行完两个对应槽函数后,第二个1000ms的定时器才执行一次槽函数。 

100ms触发

1s-2s-3s-4s-5s-6s-1s-2s-3s-4s-5s-6s-第二个触发-

总结:在不能确定定时器槽函数执行时间时,如果还存在其他定时器,当第一个定时器执行超时时,将直接影响第二个定时器的执行周期。所以在这种应用中,尽量避免定时器的循环周期小于槽函数执行时长。

当两个定时器的循环周期大于槽函数执行时间时

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <QThread>
#include <iostream>
#include <QObject>
#include <QTime>

void timer1()
{
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  1" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  2" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  3" << std::endl;
    QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  4" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  5" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  6" << std::endl;
}

void timer2()
{
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Timer2" << std::endl;
	//QThread::msleep(1000);
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTimer timeTest,timeTest2;
    timeTest.setTimerType(Qt::PreciseTimer);
    timeTest2.setTimerType(Qt::PreciseTimer);
    QObject::connect(&timeTest, &QTimer::timeout, [=]() {timer1(); });
    QObject::connect(&timeTest2, &QTimer::timeout, [=]() {timer2(); });

    timeTest2.start(1000);
    timeTest.start(7000);
   
    return a.exec();
}

结果分析:

当两个定时器在同一个线程中时,两个定时器是按单线程串行的方式执行,当其中一个定时器触发时,必须等待当前定时器执行完成后,才有可能执行另外的定时器,两个定时器的优先级感觉是随机的。这也就解释了为什么上个案例定时周期不稳定的原因。

当在主程序中添加一个for循环后 

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <QThread>
#include <iostream>
#include <QObject>
#include <QTime>

void timer1()
{
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  1" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  2" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  3" << std::endl;
    QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  4" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  5" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  6" << std::endl;
}

void timer2()
{
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Timer2" << std::endl;
	//QThread::msleep(1000);
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTimer timeTest,timeTest2;
    timeTest.setTimerType(Qt::PreciseTimer);
    timeTest2.setTimerType(Qt::PreciseTimer);
    QObject::connect(&timeTest, &QTimer::timeout, [=]() {timer1(); });
    QObject::connect(&timeTest2, &QTimer::timeout, [=]() {timer2(); });

    timeTest2.start(1000);
    timeTest.start(7000);

    for (int i=0;i<100;++i)
    {
        std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Main"<<i << std::endl;
        QThread::msleep(100);
    }
   
    return a.exec();
}

结论:两个定时器必须在for循环执行完成后,才能触发。再次 证明定时器在主线程中是以串行的方式执行。 当for循环没有结束时,定时器的timeout信号在线程中是阻塞的状况,是无法响应对应槽函数的。

当在for循环中加上人为触发其他事件QCoreApplication::processEvents() 后

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <QThread>
#include <iostream>
#include <QObject>
#include <QTime>

void timer1()
{
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  1" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  2" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  3" << std::endl;
    QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  4" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  5" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  6" << std::endl;
}

void timer2()
{
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Timer2" << std::endl;
	//QThread::msleep(1000);
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTimer timeTest,timeTest2;
    timeTest.setTimerType(Qt::PreciseTimer);
    timeTest2.setTimerType(Qt::PreciseTimer);
    QObject::connect(&timeTest, &QTimer::timeout, [=]() {timer1(); });
    QObject::connect(&timeTest2, &QTimer::timeout, [=]() {timer2(); });

    timeTest2.start(1000);
    timeTest.start(7000);

    for (int i=0;i<100;++i)
    {
        std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Main"<<i << std::endl;
		//适当的位置,插入一个processEvents,保证事件循环被处理
		QCoreApplication::processEvents();
        QThread::msleep(100);
    }
   
    return a.exec();
}

结论:当添加了 QCoreApplication::processEvents();后 在每次的for循环中都触发一次进程事件,保证timeout事件触发,是可行的。

当把for循环放到子线程中运行时 

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <QThread>
#include <iostream>
#include <QObject>
#include <QTime>

void timer1()
{
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  1" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  2" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  3" << std::endl;
    QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  4" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  5" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  6" << std::endl;
}

void timer2()
{
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Timer2" << std::endl;
	//QThread::msleep(1000);
}

class TestThread1:public QThread
{

    //Q_OBJECT
public:
     TestThread1() {

    };
    ~TestThread1() {

    };

    void run()
    {
	   for (int i=0;i<1000;++i)
	  {
	      std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  subThread"<<i << std::endl;
		  //适当的位置,插入一个processEvents,保证事件循环被处理
		  //QCoreApplication::processEvents();
	      QThread::msleep(100);
	  }
    }


};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTimer timeTest,timeTest2;
    timeTest.setTimerType(Qt::PreciseTimer);
    timeTest2.setTimerType(Qt::PreciseTimer);
    QObject::connect(&timeTest, &QTimer::timeout, [=]() {timer1(); });
    QObject::connect(&timeTest2, &QTimer::timeout, [=]() {timer2(); });

    timeTest2.start(1000);
    timeTest.start(7000);

    TestThread1* test1{nullptr};
    test1 = new TestThread1;
    test1->start();


  //  for (int i=0;i<100;++i)
  //  {
  //      std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Main"<<i << std::endl;
		适当的位置,插入一个processEvents,保证事件循环被处理
		//QCoreApplication::processEvents();
  //      QThread::msleep(100);
  //  }
   
    return a.exec();
}

 结论:当在子线程中运行时,两个定时器能正常按预想的方式运行

当在子线程中定义定时器时 

#include <QtCore/QCoreApplication>
#include <QTimer>
#include <QThread>
#include <iostream>
#include <QObject>
#include <QTime>

void timer1()
{
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  1" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  2" << std::endl;
    QThread::msleep(1000);
    std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  3" << std::endl;
    QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  4" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  5" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() <<"  6" << std::endl;
}

void timer2()
{
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Timer2" << std::endl;
	//QThread::msleep(1000);
}

void timer3()
{
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  subThreadTime3_1" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  subThreadTime3_2" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  subThreadTime3_3" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  subThreadTime3_4" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  subThreadTime3_5" << std::endl;
	QThread::msleep(1000);
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  subThreadTime3_6" << std::endl;
}

void timer4()
{
	std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  subThreadTimer4" << std::endl;
	//QThread::msleep(1000);
}

class TestThread1:public QThread
{

    //Q_OBJECT
public:
     TestThread1() {

    };
    ~TestThread1() {

    };

    void run()
    {

        QTimer time3;
        QTimer time4;
		time3.setTimerType(Qt::PreciseTimer);
		time4.setTimerType(Qt::PreciseTimer);
		QObject::connect(&time3, &QTimer::timeout, [=]() {timer3(); });
		QObject::connect(&time4, &QTimer::timeout, [=]() {timer4(); });

		time3.start(1000);
		time4.start(7000);
	   for (int i=0;i<1000;++i)
	  {
	      std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  subThread"<<i << std::endl;
		  //适当的位置,插入一个processEvents,保证事件循环被处理
		  QCoreApplication::processEvents();
	      QThread::msleep(100);
	  }
    }


};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTimer timeTest,timeTest2;
    timeTest.setTimerType(Qt::PreciseTimer);
    timeTest2.setTimerType(Qt::PreciseTimer);
    QObject::connect(&timeTest, &QTimer::timeout, [=]() {timer1(); });
    QObject::connect(&timeTest2, &QTimer::timeout, [=]() {timer2(); });

    timeTest2.start(1000);
    timeTest.start(7000);

    TestThread1* test1{nullptr};
    test1 = new TestThread1;
    test1->start();


  //  for (int i=0;i<100;++i)
  //  {
  //      std::cout << QTime::currentTime().toString("HH:mm:ss zzz").toStdString() << "  Main"<<i << std::endl;
		适当的位置,插入一个processEvents,保证事件循环被处理
		//QCoreApplication::processEvents();
  //      QThread::msleep(100);
  //  }
   
    return a.exec();
}

结论:当在子线程中定义定时器时,现象跟在主线程的现象一致。 

QCoreApplication::processEvents();
          QThread::msleep(100); 这暂停很关键,不同的暂停时间,对其他事件的影响很大,如果没有这个暂停时间,:processEvents()将无效,暂停时间越短,其他事件执行的几率就越小。在实际的应用中需要是个合适的延时。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/766896.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

13年测试老鸟总结,性能测试-并发用户数估算(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 并发用户数&#…

nuxt3初始化项目后配置eslint+prettier

1、安装 eslint 、eslint-config-prettier、eslint-plugin-prettier、prettier arn add eslint eslint-config-prettier eslint-plugin-prettier prettier -D eslint-config-prettier&#xff1a;关闭eslint中与prettier相互冲突的规则。eslint-plugin-prettier&#xff1a;赋…

26.Java 异常

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个…

【Whisper】《OpenAI Whisper 精读【论文精读】》学习笔记

方法 Whisper在论文中表示使用单模型&#xff08;single model&#xff09;来完成多个语音任务&#xff08;multitask&#xff09;&#xff0c;李沐教授认为优点是设计上比较干净&#xff1b; I. 关于单模型效果的疑问 但是他同时也提出了两个疑问&#xff1a; 使用单模型会…

Simulink仿真模块 - Data Store Read

Data Store Write:向数据存储中写入数据 库:Simulink / Signal Routing 模型为: 说明 Data Store Write 模块将其输入端口的值复制到指定的数据存储中。Data Store Write 模块执行的每个写入操作将覆盖数据存储,取代以前的内容。 此模块写入的数据存储由定义数据存储的 Dat…

刷题日记08《BFS》

概念 宽度优先搜索算法&#xff08;又称广度优先搜索&#xff09;是最简便的图的搜索算法之一&#xff0c;这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS&#xff0c;属于一种盲目搜寻…

易语言后,极语言成为官方支持语言,新中文编程语言开始革新而来

易语言促进了中文编程普及和发展 众所周知&#xff0c;吴涛先生在1997年创建的易语言称得上是中文编程的鼻祖。 易语言之后&#xff0c;很多中文编程语言接踵而至&#xff1a;甲语言、乙语言、丙语言、甲骨文编程语言、梅花编程语言等等。 为中国的软件开发者提供了更加便捷和…

什么是aPaaS?aPaaS和低代码是一回事吗?

低代码和aPaaS是近年最为火热的技术趋势之一&#xff0c;那么低代码aPaaS吗&#xff1f;两者有什么关系&#xff1f;今天小帆为大家介绍它们的前世今生。 在介绍低代码和aPaaS前&#xff0c;先要明确一个概念——云服务。云服务是基于互联网的相关服务的增加、使用和交互模式&a…

Profibus-DP转modbus RTU网关profibus主站的实现方案有哪些

远创智控YC-DPM-RTU网关在Profibus总线侧实现主站功能&#xff0c;在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备&#xff08;如&#xff1a;EH流量计、倍福编码器等&#xff09;接入到Modbus网络中&#xff1b;通过增加DP/PA耦合器&#xff0c;也可将Profibus PA从站…

如何获取microstore商品详情接口php接口jason数据字段

随着科技的发展&#xff0c;API接口成为了各行业发展的最新趋势。在微店购物平台中&#xff0c;商品详情API接口的引入&#xff0c;为商家和消费者提供了更加便捷、高效的用户体验。本文将为大家详细介绍微店商品详情API接口的优势和使用方法 商品详情API接口的优势 1.提升用户…

那些隐藏在项目中的kotlin小知识,在座各位...

写kotlin越来越久&#xff0c;很多代码虽然能看懂&#xff0c;并且能去改&#xff0c;但是不知道他用了啥&#xff0c;里面的原理是什么&#xff0c;举个例子&#xff1f;大家一起学习一下吧 内联函数 顾名思义&#xff0c;但是在项目中我遇到得很少&#xff0c;他比较适用于一…

基于互联网下的智能配电网运维

安科瑞 华楠 摘要&#xff1a;在“互联网 ”背景下实现互联网技术和智能配电网的融合成为一种必然趋势&#xff0c;本文主要针对基于“互联网 ”的智能配电网运维技术进行分析&#xff0c;在分析我国目前智能电网运维困境和现状的基础上&#xff0c;构建基于“互联网 ”的智能配…

【域名解析】 【二级域名分发】 【vue3部署】 【腾讯云cos】 【DNSPOD】

首先注册腾讯云账号登录 先在腾讯云域名系统中购买域名并且在工信部备案 我的域名 - DNSPod-免费智能DNS解析服务商-电信_网通_教育网,智能DNS 然后点击 DNSPOD DNS 解析 - 定价中心 - 腾讯云 DNSPod - 国民级 DNS 服务平台_智能DNS_免费_域名_解析_VIP_套餐 自行选择免费版…

【UE4 塔防游戏系列】09-防御塔升级、击杀敌人增加金钱

目录 效果 步骤 一、控件蓝图文本控件内容绑定金钱数 二、防御塔改造 三、击杀敌人增加金钱 四、防御塔升级功能 效果 步骤 一、控件蓝图文本控件内容绑定金钱数 1. 打开“TaFangGameMode”&#xff0c;新增一个变量命名为“PlayerMoney”&#xff0c;默认值设为2…

dp算法 力扣152乘积最大子数组

本文是Java代码&#xff01;&#xff01; 152. 乘积最大子数组 - 力扣&#xff08;LeetCode&#xff09; 一、题目详情 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该…

【C++】STL栈和队列基本功能介绍、题目练习和模拟实现(容器适配器)

stack && queue 基本功能介绍、练习和模拟实现 前言正式开始基本函数功能三道经典栈题目讲解最小栈栈的弹出压入顺序逆波兰表达式求值 模拟实现stackqueue deque 前言 本篇基本功能不会介绍太多&#xff0c;主要是说一下STL库中的接口&#xff0c;还是在这个网站上的&…

【动态内存错误详解和C的内存分区】

常见的动态内存错误 1.动态内存错误2.经典案例分析2.1案例一2.1.1**问题分析**2.1.2**修改错误** 2.2案例二2.2.1 原因分析2.2.2 解决问题 c/c内存分布1.2 内存分区简介1.2.1 栈区(stack)1.2.2 堆区(heap)1.2.3 全局(静态)区1.2.4 常量区1.2.5 代码区 1.动态内存错误 &#xf…

DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程

目标检测系列的算法模型可以说是五花八门&#xff0c;不同的系列有不同的理论依据&#xff0c;DETR的亮点在于它是完全端到端的第一个目标检测模型&#xff0c;DETR&#xff08;Detection Transformer&#xff09;是一种基于Transformer的目标检测模型&#xff0c;由Facebook A…

幼儿园门禁安全升级,其实是这么做的!

幼儿园门禁安全是确保幼儿园校园安全的重要方面。为了有效管理出入人员和防止未经授权者进入&#xff0c;幼儿园门禁系统起到了至关重要的作用。 人脸识别门禁系统作为一种先进的技术方案&#xff0c;通过准确识别个体的面部特征&#xff0c;提供了更高的安全性和便捷性。 客户…

HeidiSQL使用

​ 1、点击新建后&#xff0c;选择在根分类创建会话 2、左侧在会话名称下出现的Unnamed&#xff0c;右键选择Rename即可重命名。右侧选择数据库类型&#xff08;mysql&#xff09;&#xff0c;输入主机名&#xff08;默认本机127.0.0.1&#xff09;&#xff0c;用户名&#xff…