LINUX.ORG.RU

QTcpServer - слот для newConnection не вызывается

 


0

2

Задача такая, что мне требуется прицепить к приложению не на qt библиотеку, реализующую работающий в отдельном потоке tcp-сервер . Ну и т.к. более-менее знаком с Qt - решил приюзать его.

class App : public QApplication 
{
  Q_OBJECT
  private:
    Server* server;
    static App* instance;
    App(int argc, char** argv);
    static int getArguments(char*** argv);
    static void* thread(void*);
  public:
    static App* get();
    void run();
}
App* App::instance = NULL;

App::App(int argc, char** argv) : QApplication(argc, argv) {
  server = new Server();
  if (! server->listen()) {
    log() << "Server not listening";
    server->close();
    return;
  }
  log() << "Server listening";
}

App* App::get() {
  if (App::instance == NULL) {
    char** argv;
    int argc = App::getArguments(&argv);
    App::instance = new App(argc, argv);
  }
  return App::instance;
}

void* App::thread()
{
  log() << "Application thread";
  App::get()->exec();
  return NULL;
}

void App::run()
{
    pthread_t thread;
    pthread_create(&thread, NULL, App::thread, NULL);
}
class Server : public QTcpServer
{
  Q_OBJECT
  private slots:
    void onNewConnection();
  public:
    explicit Server(QObject* parent = NULL);
    bool listen();    
}
Server::Server() {
  connect(this, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}

bool Server::listen() {
  return ((QTcpServer*)this)->listen(HOST, PORT);
}

void Server::onNewConnection() {
  debug() << "New connection";
  QTcpSocket* socket = this->nextPendingConnection();
  socket->write("HELLO");
}

Ну и в своей вызываемой из сторонней программы функции:

App::get()->run();

В результате имею :

Server listening
Application thread
Однако же, при попытке прицепиться telnet-м :
telnet 127.0.0.1 8070
Он вроде как цепляется, но искомого hello нет. Да и в отладочном логе New connection тоже нет. Куда копать?

upd. а нет - пока упрощал вам тут, выяснил какой участок вызывал ошибку. Такое сработало бы.



Последнее исправление: alex4321 (всего исправлений: 2)

Ответ на: комментарий от false

Судя по докам - вызываемая мной функция должна быть привязанным к start слотом. А система сигналов/слотов в свою очередь - требует запущенного приложения (или нет?)

А в моём же случае - требуется как раз-таки запустить qt-е «приложение» в отдельном потоке.

alex4321
() автор топика

как собираешь? moc отрабатывает?

dib2 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.