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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QTcpSocket внутри Qthread  (Прочитано 19151 раз)
Buran
Гость
« : Июнь 10, 2010, 13:01 »

Приветствую всех.
Есть вопрос по QThread.

Создаю примерно так:

Код:
MyThread : public QThread
{

MyThread()
{
QTcpSocket socket = new QTcpSocket();
......
......
......
}


void socketWrite(QByteArray str)
{
socket->write(str);
}

}
Во время выполнения socket->write(str) выводит ошибку, что не может сделать, т.к. родительский и дочерний потоки - разные.
И действительно, this - показывает указывает на один thread, а socket->thread() - на другой.

Т.е. new QtcpSocket() создается в отдельном потоке. Наверное так и должно быть?

Вопрос: Как мне создать socket в моем потоке? Чтобы this и socket->thread() возвращали указатель на один и тот же thread?
Или может мне socket'у указать socket->MoveToThread(this) (это только идея).



UPD:
Прочитал, что можно вызвать в функции run(). Но теперь не приходит SIGNAL(readyRead()). Почему? Ведь очередь сообщений теперь в моем новом потоке, а не в основном.
Подскажите, пжл, чего я не догоняю?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #1 : Июнь 10, 2010, 13:20 »

UPD:
Прочитал, что можно вызвать в функции run(). Но теперь не приходит SIGNAL(readyRead()). Почему? Ведь очередь сообщений теперь в моем новом потоке, а не в основном.
Подскажите, пжл, чего я не догоняю?
потому что поток умирает вместе с объектами которые были в нём созданы. Поставь в run()'e exec(), и глуши его когда надо будет
« Последнее редактирование: Июнь 10, 2010, 13:27 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Buran
Гость
« Ответ #2 : Июнь 10, 2010, 14:04 »

UPD:
Прочитал, что можно вызвать в функции run(). Но теперь не приходит SIGNAL(readyRead()). Почему? Ведь очередь сообщений теперь в моем новом потоке, а не в основном.
Подскажите, пжл, чего я не догоняю?
потому что поток умирает вместе с объектами которые были в нём созданы. Поставь в run()'e exec(), и глуши его когда надо будет


Брррр....
У меня поток не умирает. Он работает, это легко подтверждается выполняемым в нем кодом. И emit слота же работает!

Не срабатывает сигнал:
Код:
class MyThread : public QThread
{

MyThread()
{
}


void run()
{
QTcpSocket* socket = new QTcpSocket();
QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(SockerRead()));
}

}

Насколько я понимаю, это может быть только если:
а) умер socket. Но, socket есть, можно запросить на него указатель.;
б) что-то с очередью сообщений;

UPD:
Кажись exec() как раз очередь сообщений и запускает. Сейчас проверю....)
« Последнее редактирование: Июнь 10, 2010, 14:12 от Buran » Записан
BRE
Гость
« Ответ #3 : Июнь 10, 2010, 14:31 »

потому что поток умирает вместе с объектами которые были в нём созданы. Поставь в run()'e exec(), и глуши его когда надо будет
По умолчанию в QThread::run как раз один exec() и запускается.
Записан
BRE
Гость
« Ответ #4 : Июнь 10, 2010, 14:32 »

Код
C++ (Qt)
class MyThread : public QThread
{
 
MyThread()
{
}
 
 
void run()
{
QTcpSocket* socket = new QTcpSocket();
QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(SockerRead()));
       exec();
}
 
}
Записан
Buran
Гость
« Ответ #5 : Июнь 10, 2010, 14:52 »

Код
C++ (Qt)
 
void run()
{
QTcpSocket* socket = new QTcpSocket();
QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(SockerRead()));
       exec();
}
 
}


Ура! Очередь сообщений заработала. Но вот выполнение потока остановилось.(

Если быть точным, то кроме связывания сигнала и слота в run() еще есть while(). Внутри которого идет постоянное выполнение кода.

И вот при exec() оно (выполнение кода в while()) останавливается.

Пока не очень понимаю почему.
Записан
BRE
Гость
« Ответ #6 : Июнь 10, 2010, 14:56 »

Пока не очень понимаю почему.
Потому, что в exec() запускается бесконечный цикл обработки событий.
Ты должен определиться, что тебе нужно. Если нужна возможность получения сигналов, то нужен exec (точнее обработка событий) и тогда с выполнением другого кода в потоке нужно думать.
Расскажи, что ты хочешь обрабатывать в цикле while()?
« Последнее редактирование: Июнь 10, 2010, 14:59 от BRE » Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #7 : Июнь 10, 2010, 15:02 »

Совершенно не понял фразы
По умолчанию в QThread::run как раз один exec() и запускается.

А это
Код
C++ (Qt)
class MyThread : public QThread
{
 
MyThread()
{
}
 
 
void run()
{
QTcpSocket* socket = new QTcpSocket();
QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(SockerRead()));
       exec();
}
 
}
вообще-то и имел ввиду
Записан

kubuntu/Win7/x64/NetBeans
Buran
Гость
« Ответ #8 : Июнь 10, 2010, 15:04 »

Расскажи, что ты хочешь обрабатывать в цикле while()?

По событию socket, SIGNAL(readyRead()) происходит обработка сокета.
А в while постоянно мониторится RS-232. Т.к. в QextSerialPort нифига не работает сигнал readyRead() я его (RS) просматриваю вручную.

Данные в потоке кидаются между ними.

В принципе, в никсах, я могу это обойти привязавшись к файлу /dev/ttyS# и смотреть его notify(). Но тогда в винда (в случае чего) мне не светит.
« Последнее редактирование: Июнь 10, 2010, 15:10 от Buran » Записан
BRE
Гость
« Ответ #9 : Июнь 10, 2010, 15:09 »

По событию socket, SIGNAL(readyRead()) происходит обработка сокета.
А в while постоянно мониторится RS-232. Т.к. в QextSerialPort нифига не работает сигнал readyRead() я его (RS) просматриваю вручную.
Ты в одном потоке и RS-232 мониторишь и из сетки данные получаешь?
Записан
Buran
Гость
« Ответ #10 : Июнь 10, 2010, 15:10 »

По событию socket, SIGNAL(readyRead()) происходит обработка сокета.
А в while постоянно мониторится RS-232. Т.к. в QextSerialPort нифига не работает сигнал readyRead() я его (RS) просматриваю вручную.
Ты в одном потоке и RS-232 мониторишь и из сетки данные получаешь?


Угу.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #11 : Июнь 10, 2010, 15:11 »

BRE, ну так что ты хотел сказать насчёт exec()?
Записан

kubuntu/Win7/x64/NetBeans
BRE
Гость
« Ответ #12 : Июнь 10, 2010, 15:15 »

BRE, ну так что ты хотел сказать насчёт exec()?
То, что если run() не переопределять, то там как раз exec() и запускается. А вот если переопределять, то его нужно вызывать явно или вызывать QThread::run():
Код
C++ (Qt)
void MyThread::run()
{
       QTcpSocket* socket = new QTcpSocket();
       QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(SockerRead()));
QThread::run(); // или exec()
}
 
Записан
BRE
Гость
« Ответ #13 : Июнь 10, 2010, 15:20 »

Угу.
Можно запустить таймер в этом потоке и через заданный интервал проверять состояние порта или разнести получение данных из сети и проверку порта по разным потокам.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #14 : Июнь 10, 2010, 15:25 »

[То, что если run() не переопределять, то там как раз exec() и запускается. А вот если переопределять, то его нужно вызывать явно или вызывать QThread::run():
Код
C++ (Qt)
void MyThread::run()
{
       QTcpSocket* socket = new QTcpSocket();
       QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(SockerRead()));
QThread::run(); // или exec()
}
 
ну естесственно его надо было переопределить, как же без этого-то! Какой смысл в потоке, если сам run() будет пустым))
« Последнее редактирование: Июнь 10, 2010, 15:30 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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