QThread::run函数的使用(涉及到QThread::run, Qthread::start,protected,virtual虚函数,override的进一步理解)

RobotCommuServer.h
#ifndef ROBOTCOMMUSERVER_H
#define ROBOTCOMMUSERVER_H #include <QThread> class RobotCommuServer : public QThread { Q_OBJECT public: explicit RobotCommuServer(QObject *parent = nullptr); ~RobotCommuServer(); void SetAppPtr(void* pPtr) {m_pAppPtr = pPtr;} void SetCtrlRunDataPtr(void* pPtr) {m_pCtrlRunData = pPtr;} void SetMainCore(void *ptr) {m_pMainCore = ptr;} void SetRobotControl(void *ptr) {m_pRobotCtrl = ptr;} bool OpenServer(unsigned short uPort=49107); void CloseServer(); signals: public slots: protected: void run();//override; int MSCM_ExecuteSend(void *pMscmData, int iOpcode1, int iPacketId); int MSCM_ExecuteReplySend(void *pMscmData, int iPacketId, int iReplyOpCode, int iReplyState,const char * pInf); bool IsSendRecvOK(void * pMscm); bool IsSendRecvTimeOut(void * pMscm); private: //指针资源 void *m_pAppPtr = nullptr; void *m_pCtrlRunData = nullptr; void *m_pMainCore = nullptr; void *m_pRobotCtrl = nullptr; //Socket bool m_bSrvOpen = false; bool m_bConnect = false; bool m_bRunWorkThread = true; bool m_bWorkThreadOn = false; }; #endif // ROBOTCOMMUSERVER_H

有点子搞笑的移植经历,想移植下位机socket代码做一个测试socket的工具,但是上边代码里的run函数,怎么也找不到调用的地方。把整套代码都研究了一遍,翻来覆去好几遍,都没找到。两天了,问了同事才知道。。。

[slot] void QThread::start(QThread::Priority priority = InheritPriority)
Begins execution of the thread by calling run(). The operating system will schedule the thread according to the priority parameter. If the thread is already running, this function does nothing.
The effect of the priority parameter is dependent on the operating system's scheduling policy. In particular, the priority will be ignored on systems that do not support thread priorities (such as on Linux, see the sched_setscheduler documentation for more details). 意思就是,QThread::start通过调用start()开启一个run()函数。这个调用是自动调用,不需要再在代码调用run函数

The starting point for the thread. After calling start(), the newly created thread calls this function. The default implementation simply calls exec().
You can reimplement this function to facilitate advanced thread management. Returning from this method will end the execution of the thread.这意思就是,你可以重写这个函数,以实现高级线程管理。

在C++中,protected关键字用于声明类的成员属性和方法,这些成员可以被类的派生类访问,但是不能被类的对象直接访问。

在使用protected关键字时,可以在类的内部和派生类中访问被声明为protected的成员。示例如下:

在C++中,protected关键字用于声明类的成员属性和方法,这些成员可以被类的派生类访问,但是不能被类的对象直接访问。

在使用protected关键字时,可以在类的内部和派生类中访问被声明为protected的成员。示例如下:
//.h文件 
#pragma once
#include <stdio.h>
class MyTestFunc
{
  public:   int m_chssposs;   static MyTestFunc *chssposs[12];   MyTestFunc(int i)   {     m_chssposs=i;     chssposs[i]=this;   }
  
~MyTestFunc(void)   {     printf("chssposs[%d]=%u\n",m_chssposs,chssposs[m_chssposs]);   };   static MyTestFunc* Instance(int i=0)   {     return chssposs[i];   }; };

 如果在声明子类函数时加 override ,可以提醒这是重写的父类。override作用如下

override是C++11中的一个继承控制保留字,放在派生类成员函数参数列表后面,用来修饰函数。override确保在派生类中声明的重载函数跟基类的虚函数有相同的签名。在父类中有一个与之对应(形参、函数名、返回值都一致)的虚函数,override表示要重写父类的虚函数,一旦函数后面加了override,编译器就会检查父类中是否有和子类中签名匹配的函数,如果没有编译器会报错。

 

. 什么是 override 关键字?
在 C++11 引入之前,派生类覆盖基类的虚函数时,如果函数签名不匹配,编译器不会发出警告或错误。这可能导致意外的行为,特别是在复杂的继承层次中。为了解决这个问题,C++11 引入了 override 关键字。

2. override 的作用
确保函数签名匹配:使用 override 关键字可以显式指示编译器,该函数意图覆盖基类中的虚函数,如果签名不匹配,则会产生编译错误。
提高代码可读性:明确标识出哪些函数是覆盖了基类的虚函数,使代码更易于理解和维护。
3. 使用 override 的示例

class Base {
public:
    virtual void print() const;
};

class Derived : public Base {
public:
    void print() const override; // 使用 override 关键字覆盖 Base 类中的虚函数
};

4. override 与 final 的区别
override:用于表示函数覆盖基类中的虚函数,可以被派生类继续覆盖。
final:用于表示类或虚函数不允许被继承或覆盖,对于类,表示不能有派生类;对于虚函数,表示不能被后续的派生类覆盖。
5. override 的实现原理
override 关键字并不影响函数的运行时行为,它只在编译期起作用,通过检查函数签名来确保正确的覆盖关系。

posted @ 2024-07-04 16:58  yyfaaa  阅读(44)  评论(0编辑  收藏  举报