Russian Qt Forum

Qt => Работа с сетью => Тема начата: OS2 от Ноября 03, 2012, 14:51



Название: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: OS2 от Ноября 03, 2012, 14:51
Всем доброго времени суток!

Есть необходимость добавить поддержку UDP протокола Qt в приложение, написанное на чистом WinAPI. Можно ли это сделать, если имеется уже готовая программа(например системная служба Windows) написанная без использования Qt и как следствие не использующая цикл обработки сообщений: QCoreApplication::exec()?

Заранее спасибо!


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: Bepec от Ноября 03, 2012, 15:55
Прочитайте себя. Поддержку UDP протокола Qt (это как??? мб написанную на Qt?) в WinApi...

В принципе вроде можно засунуть в библиотеку, но без Q...exec не будет работать сигнал-слотовая система вроде. Так что хз.


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: OS2 от Ноября 03, 2012, 16:13
Пардон за косноязычие. Имелось в виду поддержка сети, реализованная в Qt.
Цитировать
но без Q...exec не будет работать сигнал-слотовая система вроде
Имелось в виду именно это. Можно ли обойти отсутствие "Q...exec" созданием нового потока и запуска в нем локального цикла обработки сообщений, чтобы заработали сигнал-слотовые соединения?


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: Bepec от Ноября 03, 2012, 16:38
ХЗ. Где то говорилось, что exec можно запихать в библиотеку, но вам не подходит - он всё равно вызывается.


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: ssoft от Ноября 06, 2012, 07:37
Для того, чтобы использовать Qt c WinAPI необходимо организовать очередь сообщений Qt.
Для этого используется Qt solution - qtwinmigrate. Там есть необходимый tutorial.


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: Bepec от Ноября 06, 2012, 08:09
Который и является очередью событий, QApplication? :)


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: OS2 от Ноября 06, 2012, 13:23
А самому нельзя чтонибудь вроде этого написать:
Код
C++ (Qt)
class MyThread : public QThread
{
Q_OBJECT
 
public:
explicit MyThread( QObject *parent = 0 );
virtual ~MyThread();
 
protected:
virtual void run();
};
 

Код
C++ (Qt)
MyThread::MyThread( QObject *parent ) : QThread(parent)
{
moveToThread( this );
}
void MyThread::run()
{
int argc = 0;
QApplication app(argc, 0);
 
m_pSocketListener = new QUdpSocket();
m_pSocketListener->moveToThread( this );
 
m_pSocketSender = new QUdpSocket();
m_pSocketSender->moveToThread( this );
 
app.exec();
}
 

 ???


Название: Re: Как добавить сетевой интерфейс Qt в програl
Отправлено: mutineer от Ноября 06, 2012, 13:32
А самому нельзя чтонибудь вроде этого написать:

Объекты, созданные в run(), уже принадлежат этому треду, их не надо дополнительно мувать

moveToThread( this ); - это зачем в конструкторе? У класса ни слотов не используется, ни сигналов, ни вообще каких-то дополнительных методов...

Ну и это, у треда уже есть очередь событий (вызывается по exec() ), поэтому QApplication тут возможно и не нужен


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: OS2 от Ноября 06, 2012, 13:50
Нет, ну в классе есть и слоты и сигналы, без QApplication и мува в конструкторе они не работали. Сейчас, вроде, нормально стала работать сетевая сетевая часть(исаользую UDP), без этого не хотела...


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: Igors от Ноября 06, 2012, 14:20
Код
C++ (Qt)
void MyThread::run()
{
int argc = 0;
QApplication app(argc, 0);
 
m_pSocketListener = new QUdpSocket();
m_pSocketListener->moveToThread( this );
 
m_pSocketSender = new QUdpSocket();
m_pSocketSender->moveToThread( this );
 
app.exec();
}
 
Что-то явно "не то". QApplication app создать наверняка надо, но зачем искать приключений и делать это в отдельной нитке? А вот app.exec() не в масть - просто вызываете exec() (т.е. цикл самой нитки), пусть стоит и ждет сигналов


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: OS2 от Ноября 06, 2012, 14:34
Сейчас остановился на таком варианте:
Код
C++ (Qt)
MyThread::MyThread( QObject *parent ) : QThread(parent)
{
 moveToThread( this );
}
 
void MyThread::run()
{
 int argc = 0;
 QApplication app(argc, 0);
 
 m_pSocketListener = new QUdpSocket(this);
....
 m_pSocketSender = new QUdpSocket(this);
 
....
 exec();
 
}
При создании QApplication вне метода run() сигналы\слоты не срабатывают.


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: Igors от Ноября 06, 2012, 14:57
При создании QApplication вне метода run() сигналы\слоты не срабатывают.
Например ?


Название: Re: Как добавить сетевой интерфейс Qt в программу на WinAPI?
Отправлено: OS2 от Ноября 06, 2012, 15:02
Ну например выношу я его в конструктор или вообще, в main()...