7

QLocalServer を ipc ソリューションとして使用しようとしています。qtのバージョンは4.6です

これは私のmain.cppです:

int main(int argc, const char*argv[]) {  
  QServer test();

  while (true) {
  }
}

これは私の QServer クラスです:

class QServer : public QObject
{
 Q_OBJECT

public :
 QServer ();

  virtual ~QServer();

private :  
  QLocalServer* m_server;
  QLocalSocket* m_connection;


private slots:
  void socket_new_connection();
};

QServer::QServer()
{
  m_server = new QLocalServer(this);
  if (!m_server->listen("DLSERVER")) {
    qDebug() << "Testing";
    qDebug() << "Not able to start the server";
    qDebug() << m_server->errorString();
    qDebug() << "Server is " << m_server->isListening();
  }

  connect(m_server, SIGNAL(newConnection()),
          this, SLOT(socket_new_connection()));
}

void
QServer::socket_new_connection()
{
  m_connection = m_server->nextPendingConnection();

  connect(clientConnection, SIGNAL(readyRead()),
          this, SLOT(newData(clientConnection)));
}

これはすべてコンパイルされますが、実行時に newConnection() に接続しようとすると、 QSocketNotifier: Can only be used with threads started with QThread エラーが発生します。

この全体を QThread でラップしようとしましたが、それでも同じエラーが発生します。

私が間違っていること、またはスレッドが関係している理由を誰かが説明できますか?

4

1 に答える 1

13

エラーメッセージは誤解を招く恐れがあります。QSocketNotifierを使用するには、Qtイベントループが必要です。アプリケーションでこれを行う適切な方法は、QApplication(または、グラフィカルなものが必要ない場合はQCoreApplication)を作成することです。メインは次のようになります。

int main(int argc, char** argv)
{
    QCoreApplication app(argc, argv);
    QServer test();
    app.exec();
    return 0;
}

QCoreApplication :: exec()は、イベントループを開始します(ループを置き換えますwhile (true) {})。

于 2012-12-20T17:19:03.723 に答える