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

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

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

Сообщений: 4350



Просмотр профиля
« Ответ #15 : Апрель 23, 2016, 19:23 »

Рекомендую вам сначало разобраться с работой сигналов между нитками, а только потом добавлять туда сеть. На форуме много это обсуждалось, есть масса статей интернете. Там есть несколько тонкостей.
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #16 : Апрель 23, 2016, 19:33 »

Рекомендую вам сначало разобраться с работой сигналов между нитками, а только потом добавлять туда сеть. На форуме много это обсуждалось, есть масса статей интернете. Там есть несколько тонкостей.
А можете дать ссылку на какую нибудь хорошую статью?
Статей то много, но непонятно чему верить а чему нет. Нет времени всё перепробовать.
Что-то такое пишут - это правильный способ?
Код
C++ (Qt)
class Worker : public QObject
{
Q_OBJECT
 
public slots:
void doWork() {
/''' … */
}
};
 
/'
''*/
QThread thread;
Worker worker;
connect(obj, SIGNAL (workReady()), &worker, SLOT (doWork()));
worker.moveToThread(&thread);
thread.start();
Может есть в сети готовые исходники сервера с обработкой заданий?

А на boost это легче написать?
С boost совсем не знаком.
« Последнее редактирование: Апрель 23, 2016, 19:39 от qtkoder777 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #17 : Апрель 23, 2016, 20:09 »

А можете дать ссылку на какую нибудь хорошую статью?
К сожалению ссылок не знаю. Основные моменты там в том, что если инициатор сигнала расположен в другом потоке от получателя, то слот вызывается не в момент испускания сигнала, а через очередь сообщений потока-получателя. Т.е. для работы этого механизма, в потоке-получателе должен крутиться цикл обработки событий. Все аргументы сигнала сохраняются в событии и слот вызывается с копиями этих аргументов. Последний параметр connect как раз отвечает за тип подключения.

Что-то такое пишут - это правильный способ?
Это рабочий способ.

А на boost это легче написать?
С boost совсем не знаком.
Легче, если умеете на нем. Если не знакомы, то с Qt будет проще.
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #18 : Апрель 23, 2016, 20:46 »

Я поставил последний параметр Qt::QueuedConnection и это не помогло.
Написано что по умолчанию Qt сам определяет один поток или разные.
Почему сокет не принимает данные если сделать connect?
« Последнее редактирование: Апрель 23, 2016, 20:51 от qtkoder777 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #19 : Апрель 23, 2016, 20:56 »

Я поставил последний параметр Qt::QueuedConnection и это не помогло.
Написано что по умолчанию Qt сам определяет один поток или разные.
Сокет не принимает данные.
Метод научного тыка здесь вряд-ли поможет. Вначале разберитесь просто с сигналами, что бы один поток посылал сигнал, а во втором срабатывал слот. Погоняйте туда-сюда данные.
А уже потом добавляйте сеть. Я уже писал, но повторю: для работы с клиентами достаточно одного потока, в котором и будут работать все сокеты, а вот для обработки можно использовать пул рабочих потоков.
Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #20 : Апрель 23, 2016, 21:02 »


Метод научного тыка здесь вряд-ли поможет. Вначале разберитесь просто с сигналами, что бы один поток посылал сигнал, а во втором срабатывал слот.
По каким материалам разбираться? Вот вы что читали?
Где-то пишут что надо использовать moveToThread. А без этого можно?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #21 : Апрель 23, 2016, 21:09 »

По каким материалам разбираться? Вот вы что читали?
Документацию + смотрел исходники Qt. Но я Qt начал использовать году в 2000, так что все эти "нововведения" с межпоточными сигналами появлялись на моих глазах. Улыбающийся

Где-то пишут что надо использовать moveToThread. А без этого можно?
С помощью этого метода вы указываете в контексте какой нитки будет существовать объект. Это важно для правильного определения типа коннекта: если объект инициатор и объект получатель в разных потоках, то будет использоваться вызов слота получателя через его очередь сообщений.
« Последнее редактирование: Апрель 23, 2016, 21:16 от Old » Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #22 : Апрель 23, 2016, 21:21 »

Нужна волшебная строчка, которая законнектит сигнал из одного потока на слот в другом потоке.
Почему нельзя её написать?
Или это страница кода, а не строчка?
Потоки делаю как наследники от QThread согласно документации на Qt. Хотя кое-где пишут что это неправильно.
Вот эта статья более не менее рабочая?
https://habrahabr.ru/post/150274/
« Последнее редактирование: Апрель 23, 2016, 21:25 от qtkoder777 » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #23 : Апрель 23, 2016, 21:28 »

Нужна волшебная строчка, которая законнектит сигнал из одного потока на слот в другом потоке.
Почему нельзя её написать?
Или это страница кода, а не строчка?
Потоки делаю как наследники от QThread согласно документации на Qt. Хотя кое-где пишут что это неправильно.
Нет никаких волшебных строчек. Для демонстрации нужно написать два класса, я сейчас пишу с телефона, у меня нет возможности набирать код.

Я бы не затевался с QThread, я бы взял QtConcurrent для выполнения функций в отдельных потоках + QFutureWatcher для определения завершения расчета и получения результата. Посмотрите на QtConcurrent, это высокоуровневая надстройка над пулом потоков.

QFuture<T> QtConcurrent::run(Function function, ... )
« Последнее редактирование: Апрель 23, 2016, 21:29 от Old » Записан
qtkoder777
Частый гость
***
Offline Offline

Сообщений: 245


Просмотр профиля
« Ответ #24 : Апрель 23, 2016, 22:49 »

А сервер не обязан быть многопоточным - на каждого клиента свой поток?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #25 : Апрель 24, 2016, 06:26 »

А сервер не обязан быть многопоточным - на каждого клиента свой поток?
Конечно не обязан, более того такой сервер не жизнеспособен, когда должен обслуживать тысячи клиентов одновременно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Апрель 24, 2016, 07:52 »

Что-то такое пишут - это правильный способ?
Да. Хотя наследование от QThread будет работать с тем же успехом - создание worker'а более идейно/концептуально, в общем "рекомендуют".

Почему сокет не принимает данные если сделать connect?
Сокет-сокет.. Вы сначала убедитесь что сконнектились верно, т.е. сигнал испущенный из одной нитки принимается в другой. Для этого надо сделать moveToThread как в примере (или moveToThread(this) если наследуетесь от QThread). Для проверки поставьте печать (напр qDebug() << QThread::currentThread()) тут и там.
« Последнее редактирование: Апрель 24, 2016, 07:54 от Igors » Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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