Russian Qt Forum
Ноябрь 23, 2024, 18:22 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как добавить сетевой интерфейс Qt в программу на WinAPI?  (Прочитано 8239 раз)
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« : Ноябрь 03, 2012, 14:51 »

Всем доброго времени суток!

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

Заранее спасибо!
Записан
Bepec
Гость
« Ответ #1 : Ноябрь 03, 2012, 15:55 »

Прочитайте себя. Поддержку UDP протокола Qt (это как??? мб написанную на Qt?) в WinApi...

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

Сообщений: 186



Просмотр профиля WWW
« Ответ #2 : Ноябрь 03, 2012, 16:13 »

Пардон за косноязычие. Имелось в виду поддержка сети, реализованная в Qt.
Цитировать
но без Q...exec не будет работать сигнал-слотовая система вроде
Имелось в виду именно это. Можно ли обойти отсутствие "Q...exec" созданием нового потока и запуска в нем локального цикла обработки сообщений, чтобы заработали сигнал-слотовые соединения?
Записан
Bepec
Гость
« Ответ #3 : Ноябрь 03, 2012, 16:38 »

ХЗ. Где то говорилось, что exec можно запихать в библиотеку, но вам не подходит - он всё равно вызывается.
Записан
ssoft
Гость
« Ответ #4 : Ноябрь 06, 2012, 07:37 »

Для того, чтобы использовать Qt c WinAPI необходимо организовать очередь сообщений Qt.
Для этого используется Qt solution - qtwinmigrate. Там есть необходимый tutorial.
Записан
Bepec
Гость
« Ответ #5 : Ноябрь 06, 2012, 08:09 »

Который и является очередью событий, QApplication? Улыбающийся
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #6 : Ноябрь 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();
}
 

 Непонимающий
Записан
mutineer
Гость
« Ответ #7 : Ноябрь 06, 2012, 13:32 »

А самому нельзя чтонибудь вроде этого написать:

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

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

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

Сообщений: 186



Просмотр профиля WWW
« Ответ #8 : Ноябрь 06, 2012, 13:50 »

Нет, ну в классе есть и слоты и сигналы, без QApplication и мува в конструкторе они не работали. Сейчас, вроде, нормально стала работать сетевая сетевая часть(исаользую UDP), без этого не хотела...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Ноябрь 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() (т.е. цикл самой нитки), пусть стоит и ждет сигналов
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #10 : Ноябрь 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() сигналы\слоты не срабатывают.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Ноябрь 06, 2012, 14:57 »

При создании QApplication вне метода run() сигналы\слоты не срабатывают.
Например ?
Записан
OS2
Самовар
**
Offline Offline

Сообщений: 186



Просмотр профиля WWW
« Ответ #12 : Ноябрь 06, 2012, 15:02 »

Ну например выношу я его в конструктор или вообще, в main()...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.123 секунд. Запросов: 23.