在子类化线程中,因为线程的依赖性会导致所有除run中运行的函数都会在主线程中运行,如果我们想让这个子类中的所有函数都在子类中运行的话就要改变它的依赖性
class QPlayOnWallThread : public QThread
{
Q_OBJECT
public:
QPlayOnWallThread();
~QPlayOnWallThread();
void initValue(); //初始化数据
void initWallThread(); //初始化:读配置、读记录
bool wirteRecord(); //缓存记录
Q_SIGNALS:
void sendWallInfo(QWallInfo info);
void sendStart();
public Q_SLOTS:
void test_slot();
void PlatPreviewOnTvwall_slot(const char * szCameraIndexCode, int iTvWallId, int iWndId); //上墙
protected:
virtual void run(); //根据记录上墙
private:
// bool readRecord(); //读缓存记录
bool readConfig(); //读配置文件
private:
bool errorFlag;
QWallInfo m_info;
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
test = new QPlayOnWallThread;
test->moveToThread(test);//修改依赖性
test->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
test->PlatPreviewOnTvwall_slot("cc",1,1);
}
修改依赖性后就可以使得我们创建的子类中的函数都在子线程中运行。
但是void MainWindow::on_pushButton_clicked()这个函数运行以后你会发现PlatPreviewOnTvwall_slot("cc",1,1)是在主线程中运行的,为什么呢?因为调用PlatPreviewOnTvwall_slot("cc",1,1);这句话是主线程中调用的所以运行也是主线程中运行。
我总结了一点:对于线程类来说想让其在子线程中运行,那么就不要在主程序中调用子线程类中的函数。(前提是修改了它的依赖对象,否则除了run中运行的函数都是在主线程中运行)
不修改依赖性的结果:
修改依赖性的结果:
C++交流群:585225803