Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
Qt 即使套接字上有0个数据,qsocketnotifier也会持续发出激活信号_Qt_Qt4.7_Qt5 - Fatal编程技术网

Qt 即使套接字上有0个数据,qsocketnotifier也会持续发出激活信号

Qt 即使套接字上有0个数据,qsocketnotifier也会持续发出激活信号,qt,qt4.7,qt5,Qt,Qt4.7,Qt5,我试图将qsocketnotifier与TCP套接字一起使用,问题是即使套接字上没有数据可读取,qsocketnotifier也会持续触发“已激活”信号。我在“阻塞”和“非阻塞”模式下都在套接字上尝试过。行为是一样的。有人看到过这个吗? 我正在粘贴下面的代码块 QSocketNotifier *notifier = new QSocketNotifier(gwSocketId, QSocketNotifier::Read, this); connect(notifier, SIGNAL

我试图将qsocketnotifier与TCP套接字一起使用,问题是即使套接字上没有数据可读取,qsocketnotifier也会持续触发“已激活”信号。我在“阻塞”和“非阻塞”模式下都在套接字上尝试过。行为是一样的。有人看到过这个吗? 我正在粘贴下面的代码块

 QSocketNotifier *notifier = new QSocketNotifier(gwSocketId, QSocketNotifier::Read, this);
    connect(notifier, SIGNAL(activated(int)), this, SLOT(processClientEvents()));
从:

尽管该类称为QSocketNotifier,但它通常用于 插座以外的其他类型的设备。QTcpSocket和QUdpSocket提供 通过信号进行通知,因此通常不需要使用 QSocketNotifier

继承自,因此具有信号。我想这个信号就是你想要的。

来自:

尽管该类称为QSocketNotifier,但它通常用于 插座以外的其他类型的设备。QTcpSocket和QUdpSocket提供 通过信号进行通知,因此通常不需要使用 QSocketNotifier


继承自,因此具有信号。我想这个信号就是你想要的。

我在使用QSocketNotifier+QTextStream从stdin读取时遇到了同样的问题。如果用一次写入将多行发送到应用程序,我将得到比要读取的行更多的QSocketNotifier::activated()信号。导致一个额外的QTextStream::readLine()调用被阻塞,导致我的应用程序中的事件处理停止,直到我发送另一行

我尝试使用QTextStream::readAll,但它总是阻塞到文件末尾,这使得问题在第一个QSocketNotifier::activated()信号上出现

在进行阻塞的QTextStream::readLine()调用之前,我尝试着找出如何判断是否确实有任何数据要从stdin读取,最后我停止使用QTextStream,而是使用fgets()。这似乎解决了我的问题

下面是一些示例代码(没有调整为处理非常大的行,这是读者的练习)。希望这能帮别人省去我为解决这个问题所经历的头疼。我加入了一些额外的信号/事件处理,因为这是确定是否进入阻塞状态的可靠方法

示例StdinReader标头:

#include <QCoreApplication>
#include <QSocketNotifier>
#include <QTimer>
#include <cstdio>

class StdinReader : public QObject
{
  Q_OBJECT

public:
  StdinReader(QObject* parent = 0)
    : QObject(parent),
      notifier(new QSocketNotifier(fileno(stdin), QSocketNotifier::Read, this))
  {
    connect(this, SIGNAL(sigOutputData(QString)), SLOT(outputData(QString)));
    connect(notifier, SIGNAL(activated(int)), SLOT(consumeData()));
    notifier->setEnabled(true);
    QTimer::singleShot(1000, this, SLOT(timerTick()));
  }

  ~StdinReader() { }

signals:
  void sigOutputData(QString);

private slots:
  void outputData(QString data)
  {
    fprintf(stdout, "Data: %s\n", data.trimmed().toUtf8().constData());
    fflush(stdout);
  }

  void timerTick()
  {
    emit sigOutputData(QString::fromUtf8("tick"));
    QTimer::singleShot(1000, this, SLOT(timerTick()));
  }

  void consumeData()
  {
    notifier->setEnabled(false);

    fprintf(stdout, "Reading\n");
    fflush(stdout);

    char sbuf[8192];
    if (!fgets(sbuf, sizeof(sbuf), stdin)) {
      fprintf(stdout, "EOF\n");
      fflush(stdout);
      QCoreApplication::exit();
      return;
    }

    emit sigOutputData(QString::fromUtf8(sbuf));

    notifier->setEnabled(true);
  }

private:
  QSocketNotifier* notifier;
};

我在使用QSocketNotifier+QTextStream从stdin读取时遇到了同样的问题。如果用一次写入将多行发送到应用程序,我将得到比要读取的行更多的QSocketNotifier::activated()信号。导致一个额外的QTextStream::readLine()调用被阻塞,导致我的应用程序中的事件处理停止,直到我发送另一行

我尝试使用QTextStream::readAll,但它总是阻塞到文件末尾,这使得问题在第一个QSocketNotifier::activated()信号上出现

在进行阻塞的QTextStream::readLine()调用之前,我尝试着找出如何判断是否确实有任何数据要从stdin读取,最后我停止使用QTextStream,而是使用fgets()。这似乎解决了我的问题

下面是一些示例代码(没有调整为处理非常大的行,这是读者的练习)。希望这能帮别人省去我为解决这个问题所经历的头疼。我加入了一些额外的信号/事件处理,因为这是确定是否进入阻塞状态的可靠方法

示例StdinReader标头:

#include <QCoreApplication>
#include <QSocketNotifier>
#include <QTimer>
#include <cstdio>

class StdinReader : public QObject
{
  Q_OBJECT

public:
  StdinReader(QObject* parent = 0)
    : QObject(parent),
      notifier(new QSocketNotifier(fileno(stdin), QSocketNotifier::Read, this))
  {
    connect(this, SIGNAL(sigOutputData(QString)), SLOT(outputData(QString)));
    connect(notifier, SIGNAL(activated(int)), SLOT(consumeData()));
    notifier->setEnabled(true);
    QTimer::singleShot(1000, this, SLOT(timerTick()));
  }

  ~StdinReader() { }

signals:
  void sigOutputData(QString);

private slots:
  void outputData(QString data)
  {
    fprintf(stdout, "Data: %s\n", data.trimmed().toUtf8().constData());
    fflush(stdout);
  }

  void timerTick()
  {
    emit sigOutputData(QString::fromUtf8("tick"));
    QTimer::singleShot(1000, this, SLOT(timerTick()));
  }

  void consumeData()
  {
    notifier->setEnabled(false);

    fprintf(stdout, "Reading\n");
    fflush(stdout);

    char sbuf[8192];
    if (!fgets(sbuf, sizeof(sbuf), stdin)) {
      fprintf(stdout, "EOF\n");
      fflush(stdout);
      QCoreApplication::exit();
      return;
    }

    emit sigOutputData(QString::fromUtf8(sbuf));

    notifier->setEnabled(true);
  }

private:
  QSocketNotifier* notifier;
};