Задача такая, что мне требуется прицепить к приложению не на 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 127.0.0.1 8070
upd. а нет - пока упрощал вам тут, выяснил какой участок вызывал ошибку. Такое сработало бы.