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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: QTcoSocket прием данных в отдельном потоке.  (Прочитано 22081 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #30 : Январь 25, 2014, 11:27 »

Улыбающийся Это что за кривота? Зачем поток в себя же запихивать?! Шокированный
Это запись означает, что нужно объект QThread перенести из контекста нитки его создавшей в контекст нитки этого объекта. Улыбающийся

Если пересмотреть архитектуру, то таких вещей делать не придется, но для этого надо вникать. Улыбающийся
Записан
GPPsoft
Гость
« Ответ #31 : Январь 25, 2014, 11:31 »

Улыбающийся Это что за кривота? Зачем поток в себя же запихивать?! Шокированный
Это запись означает, что нужно объект QThread перенести из контекста нитки его создавшей в контекст нитки этого объекта. Улыбающийся

Если пересмотреть архитектуру, то таких вещей делать не придется, но для этого надо вникать. Улыбающийся

А что тут пересматривать? Все же просто. Надо чтобы чтение данных было в отдельном потоке, а работа с сокетом в любом потоке.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #32 : Январь 25, 2014, 11:44 »

А что тут пересматривать? Все же просто. Надо чтобы чтение данных было в отдельном потоке, а работа с сокетом в любом потоке.
Например, сделать объект обработчик, который будет взаимодействовать с сокетом и уже эту связку помещать в отдельную нитку. Тогда не придется наследоваться не от сокета, не от нитки.
Записан
GPPsoft
Гость
« Ответ #33 : Январь 25, 2014, 11:50 »

А что тут пересматривать? Все же просто. Надо чтобы чтение данных было в отдельном потоке, а работа с сокетом в любом потоке.
Например, сделать объект обработчик, который будет взаимодействовать с сокетом и уже эту связку помещать в отдельную нитку. Тогда не придется наследоваться не от сокета, не от нитки.
Т.е обернуть работу с сокетом в класс и запустить его в отдельном потоке? А как же мне тогда из GUI дергать за методы? Ведь та же самая проблема будет.
Записан
GPPsoft
Гость
« Ответ #34 : Январь 25, 2014, 11:58 »

Постараюсь описать то чего я хочу добиться. Хочу написать некий класс Session который будет работать с сокетом.
Класс должен:
1. Иметь конструктор Session(const QTcpSocket), либо метод setClientSocket(const QTcpSocket)
2. Читать данные в отдельном потоке
3. Иметь метод отключения, аля disconnectFromHost(потокобезопасный)
4. Испускать служебные сигналы(сигнал отключения от хоста и т.д)

Далее я наследуюсь этого класса и расширяю его функционал, в зависимости от предназначения.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #35 : Январь 25, 2014, 12:01 »

Лучше смотреть на саму задачу... что должен этот класс Session делать?
Записан
GPPsoft
Гость
« Ответ #36 : Январь 25, 2014, 12:04 »

Лучше смотреть на саму задачу... что должен этот класс Session делать?

Принимать в качестве параметра конструктора или через метод объект сокета и обрабатывать приходящие данные в отдельном потоке. Могу показать реализацию подобного класса на java. Собственно я и хочу повторить его. Сейчас приведу пример.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #37 : Январь 25, 2014, 12:06 »

Принимать в качестве параметра конструктора или через метод объект сокета и обрабатывать приходящие данные в отдельном потоке. Могу показать реализацию подобного класса на java. Собственно я и хочу повторить его. Сейчас приведу пример.
Не надо яву. Улыбающийся
Абстрагируйтесь от конструкторов и параметров, что нужно сделать. Улыбающийся
 
Записан
GPPsoft
Гость
« Ответ #38 : Январь 25, 2014, 12:08 »

Максимально упростил. Оставил только ключевые моменты.
Код
Java
public abstract class Session {
 
public static final int BUFFER_SIZE=8192*2;
public static final int ALIVE_TIMEOUT = 60000;
 
private Socket mClient=null;
 
public void killSession() {
if (mClient != null){
try {
this.mClient.close();
} catch (IOException e) {
e.printStackTrace();
}
               }
}
 
public void setClientSocket(Socket client) throws IOException{
 
if(this.mClient!=null){
mClient.close();
}
 
this.mClient=client;
 
mAliveTimer= new Timer("ALIVE_TIMER");
mAliveTimer.schedule(new TimerTask() {
public void run() {
sendData(new Packets.KeepAlive());
}
},ALIVE_TIMEOUT,ALIVE_TIMEOUT);
 
new Thread(new ClientDataRead(),"CLIENT_THREAD").start();
}
 
protected synchronized boolean sendData(byte[] data){
if(mClient!=null){
try{
mClient.getOutputStream().write(data);
}
catch(Exception ex){
return false;
}
return true;
}else{
return false;
}
}
 
protected abstract void disconnect();
 
public class ClientDataRead implements Runnable{
 
public void run(){
try{  
int receivedBytes;
               byte[] dataBuffer = new byte[BUFFER_SIZE];
 
               while ((receivedBytes = stream.read(dataBuffer, 0, dataBuffer.length)) != -1) {
             //Тут я обрабатываю данные....
               }
 
disconnect();
}
catch(Exception ex)
{
ex.printStackTrace();
mAliveTimer.cancel();
disconnect();
}
finally
{
try {
mClient=null;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
 
Записан
GPPsoft
Гость
« Ответ #39 : Январь 25, 2014, 12:10 »

Принимать в качестве параметра конструктора или через метод объект сокета и обрабатывать приходящие данные в отдельном потоке. Могу показать реализацию подобного класса на java. Собственно я и хочу повторить его. Сейчас приведу пример.
Не надо яву. Улыбающийся
Абстрагируйтесь от конструкторов и параметров, что нужно сделать. Улыбающийся
Думаю проще кодом объяснить. В приведенном примере обработка данных происходит в отдельном потоке. Остальная работа с классом сокета - "потоконезависима".
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #40 : Январь 25, 2014, 12:13 »

Думаю проще кодом объяснить. В приведенном примере обработка данных происходит в отдельном потоке. Остальная работа с классом сокета - "потоконезависима".
Сейчас нужно уехать, чуть позже... Улыбающийся
Записан
GPPsoft
Гость
« Ответ #41 : Январь 25, 2014, 12:17 »

Думаю проще кодом объяснить. В приведенном примере обработка данных происходит в отдельном потоке. Остальная работа с классом сокета - "потоконезависима".
Сейчас нужно уехать, чуть позже... Улыбающийся
Вообщем все что мне нужно, это повторить класс Session который я реализовал на java.

P.S: Буду ждать! Спасибо за проявленный интерес Подмигивающий
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #42 : Январь 25, 2014, 14:30 »

Вообщем все что мне нужно, это повторить класс Session который я реализовал на java.
Тогда вы его уже практически повторили, осталось отвязать прямой вызов killConnection (использовать сигналы).

Другой вариант, это сделать через воркер (обработчик трафика), примерно так:
Код
C++ (Qt)
QThread *th = new QThread;
 
QTcpSocket *sock = new QTcpSocket;
sock->moveToThread( th );
 
Worker *w = new Worker;
w->moveToThread( th );
 
// Подключаем нужные сигналы между сокетом и работалкой.
connect( sock, ..., w ... );
connect( sock, ..., w ... );
 
th->start();
 

Или можно оформить весь процесс работы в одной функции и использовать QtConcurent, для запуска их в разных нитках.

Записан
GPPsoft
Гость
« Ответ #43 : Февраль 05, 2014, 07:05 »

Вообщем все что мне нужно, это повторить класс Session который я реализовал на java.
Тогда вы его уже практически повторили, осталось отвязать прямой вызов killConnection (использовать сигналы).

Другой вариант, это сделать через воркер (обработчик трафика), примерно так:
Код
C++ (Qt)
QThread *th = new QThread;
 
QTcpSocket *sock = new QTcpSocket;
sock->moveToThread( th );
 
Worker *w = new Worker;
w->moveToThread( th );
 
// Подключаем нужные сигналы между сокетом и работалкой.
connect( sock, ..., w ... );
connect( sock, ..., w ... );
 
th->start();
 

Или можно оформить весь процесс работы в одной функции и использовать QtConcurent, для запуска их в разных нитках.

Т.е как я понимаю Worker это мой класс который должен обрабатывать входящий трафик? И в данном примере он будет обрабатывать все сигналы от сокета в отдельном потоке?
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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