Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: merke от Сентябрь 10, 2010, 16:14



Название: Вопрос по многопоточности
Отправлено: merke от Сентябрь 10, 2010, 16:14
Всем привет!

В потоках я не очень, не приходилось ещё писать приложения где бы использовал многопоточность, но приходилось читать.

Уважаемые форумчане, не могли бы Вы мне кто нибудь дать объяснение методу moveToThread и показать малленький примерчик использования.

Буду очень благодарен помощи!


Название: Re: Вопрос по многопоточности,
Отправлено: Amigo_sa от Сентябрь 10, 2010, 16:24
Каждый объект, созданный в приложении "принадлежит" потоку, в котором был создан. В том смысле, что его сигналы и слоты будут обрабатываться в цикле событий (EventLoop) данного потока. Метод moveToThread нужен, чтобы сменить поток, в котором будут обрабатываться сигналы объекта.
Есть одна фишка, что если вы создаете экземпляр (наследник) QThread, то он сам (и все другие объекты, созданные в конструкторе) принадлежит не себе, а потоку, в котором создан. Так что часто видел код типа
MyThread::MyThread
{
moveToThread(this);
}


Название: Re: Вопрос по многопоточности,
Отправлено: merke от Сентябрь 10, 2010, 16:43
Т.е. например возьмем за основу приложением многопоточный сервер. Допустим он обслуживает очень много соединений, ну пусть максимум 1000. Чтобы не создавать для каждого нового клиента отдельный поток, я бы например хотел создать 5 потоков, каждый из которых обслуживал по 200 клиентов.

Так идем дальше. При подключении нового клиента я создаю для него новый поток и потом этот поток методом MoveToThread перемещаю в один из тех 5 потоков, правильно я мыслю?


Название: Re: Вопрос по многопоточности,
Отправлено: Amigo_sa от Сентябрь 10, 2010, 17:15
Т.е. например возьмем за основу приложением многопоточный сервер. Допустим он обслуживает очень много соединений, ну пусть максимум 1000. Чтобы не создавать для каждого нового клиента отдельный поток, я бы например хотел создать 5 потоков, каждый из которых обслуживал по 200 клиентов.

Так идем дальше. При подключении нового клиента я создаю для него новый поток и потом этот поток методом MoveToThread перемещаю в один из тех 5 потоков, правильно я мыслю?
Вы же хотели не создавать потоков для каждого подключения:)
Я бы сделал проще. Допустим в вашем пуле 5 рабочих потоков и 1 главный, принимающий входящие соединения. Каждый из потоков я бы связал сигналом с событием входящего соединения. И просто дергал бы эти сигналы с параметрами. А обрабатываться они будут в рабочих потоках. Тут только нужно как то распределить нагрузку между потоками, но это думаю, не сложно.


Название: Re: Вопрос по многопоточности
Отправлено: SASA от Сентябрь 13, 2010, 15:32
Буду очень благодарен помощи!

Назавите тему со смыслом - помощи будет больше.

Цитировать
Многопоточное программирование > Вопрос по многопоточности

Это масло масляное.