Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
qtc++;在主窗口中创建线程_Qt_Qthread - Fatal编程技术网

qtc++;在主窗口中创建线程

qtc++;在主窗口中创建线程,qt,qthread,Qt,Qthread,我正在构建一个应用程序,它通过串行接口接收数据。所以我实现了一个用于串行处理的类,它可以成功地接收和发送数据。现在我尝试将数据移动到UI,并将其发送到控制台,但我需要一个线程,这似乎比我预期的要困难 因此,我需要定义一个线程,并在用户界面创建开始时启动它,然后该线程应该轮询函数以获取新数据。我研究了如何创建一个线程并将其连接到回调函数,但它始终与创建一个类相关,该类继承自QThread,而我无法对主UI执行此操作 我应该如何在主UI中定义线程,然后用它来轮询函数 编辑:根据建议,这里不需要线程,

我正在构建一个应用程序,它通过串行接口接收数据。所以我实现了一个用于串行处理的类,它可以成功地接收和发送数据。现在我尝试将数据移动到UI,并将其发送到控制台,但我需要一个线程,这似乎比我预期的要困难

因此,我需要定义一个线程,并在用户界面创建开始时启动它,然后该线程应该轮询函数以获取新数据。我研究了如何创建一个线程并将其连接到回调函数,但它始终与创建一个类相关,该类继承自QThread,而我无法对主UI执行此操作

我应该如何在主UI中定义线程,然后用它来轮询函数

编辑:根据建议,这里不需要线程,但我不知道如何在没有对象的类中调用函数。在mainWindow类中,我创建了一个用于串行通信的对象,该类中包含了标签和按钮等所有UI内容。在这个对象内部,当接收到新数据时,会调用一个中断。例如,我可以在这个串行对象中对这些数据进行排队,但我仍然需要以某种方式转发它们


Edit2:第一种实际有效的方法是实现一个计时器,它定期调用更新函数。但是,由于串行rx是中断驱动的,因此必须有一种回调方法,这样我就不需要轮询它。

如注释中所述,在本用例中,最好不要使用线程,而是利用Qt事件循环和信号槽机制。下面是MainWindow和SerialReciver类的框架,以及它们在main.cpp中是如何连接在一起的。为简单起见,SerialReceiver类只是在当前时间内每秒发出一次信号,该信号将附加到主窗口中editfield的内容中

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPlainTextEdit>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void onSerialMessage(const QString &msg);
private:
    QPlainTextEdit mTextField;

};
serialreceiver.h:

#ifndef SERIALRECEIVER_H
#define SERIALRECEIVER_H

#include <QObject>
#include <QTimer>

class SerialReceiver : public QObject
{
    Q_OBJECT
public:
    explicit SerialReceiver(QObject *parent = nullptr);

signals:
    void newMsg(const QString &msg);


public slots:
    void onSerialReceived();
private:
    QTimer mTimer;
};

#endif // SERIALRECEIVER_H
\ifndef SERIALRECEIVER\u H
#定义串行接收器
#包括
#包括
类SerialReceiver:公共QObject
{
Q_对象
公众:
显式串行接收器(QObject*parent=nullptr);
信号:
void newMsg(常量QString&msg);
公众时段:
在SerialReceived()上无效;
私人:
QTimer-mTimer;
};
#endif//SERIALRECEIVER\u H
serialreceiver.cpp:

#include "serialreceiver.h"
#include <QDateTime>

SerialReceiver::SerialReceiver(QObject *parent) : QObject(parent)
{
    mTimer.setInterval(1000);
    mTimer.setSingleShot(false);
    connect(&mTimer, &QTimer::timeout,this,&SerialReceiver::onSerialReceived);
    mTimer.start();
}
void
SerialReceiver::onSerialReceived()
{
    QDateTime now = QDateTime::currentDateTime();
    emit newMsg(now.toString());
}
#包括“serialreceiver.h”
#包括
SerialReceiver::SerialReceiver(QObject*父对象):QObject(父对象)
{
mTimer.setInterval(1000);
mTimer.setSingleShot(假);
连接(&mTimer,&QTimer::timeout,this,&SerialReceiver::onSerialReceived);
mTimer.start();
}
无效的
SerialReceiver::onSerialReceived()
{
QDateTime now=QDateTime::currentDateTime();
emit newMsg(now.toString());
}
和main.cpp:

#include "mainwindow.h"
#include "serialreceiver.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    SerialReceiver receiver;
    MainWindow w;
    QObject::connect(&receiver, &SerialReceiver::newMsg,
            &w,&MainWindow::onSerialMessage);
    w.show();
    return a.exec();
}
#包括“mainwindow.h”
#包括“serialreceiver.h”
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
串行接收机;
主窗口w;
QObject::connect(&receiver,&SerialReceiver::newMsg),
&w、 &主窗口::onSerialMessage);
w、 show();
返回a.exec();
}

拥有一个线程是个好主意,但您确定需要它吗?你可以不穿线就让它溜走。您可以读取数据包,然后在超时的情况下显示它们。在这里看一看。这里有一些如何使用线程的示例。顺便说一句,没有“主UI中的线程”这样的东西。您创建了一个线程,并以各种方式与它通信。使用Qt,您将启动类似于。根据您的简要描述,您可能不需要线程,甚至不需要轮询串行通信类。Qt实现这一点的方法是从串行通信类发出信号,该信号将在主窗口类的插槽中处理。嗯,好的。目前我可以接收中断驱动的数据,但我不知道如何将数据转发到主窗口进行绘图等。我需要一个主窗口类的对象,将数据转发到,对吗?我不太擅长C++,通常我用C来做嵌入式系统。谢谢,我正需要的。
#include "mainwindow.h"
#include "serialreceiver.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    SerialReceiver receiver;
    MainWindow w;
    QObject::connect(&receiver, &SerialReceiver::newMsg,
            &w,&MainWindow::onSerialMessage);
    w.show();
    return a.exec();
}