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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: БД и многопоточность  (Прочитано 17161 раз)
BRE
Гость
« Ответ #15 : Сентябрь 19, 2011, 20:46 »

Ну так я их и определял
Ты их в функции что ли определял?

Код
C++ (Qt)
DatabaseAccessor::dbHost;
DatabaseAccessor::dbName;
 
DatabaseAccessor::DatabaseAccessor(QObject *parent)              
{
    db.setHostName(dbHost);
    db.setDatabaseName(dbName);
    ...
 

и так
А так ты им значения присваиваешь.

А где бы найти нормальное описание создания классов , только практически а не теория...
Рекомендую любую книгу по C++. Подмигивающий
Записан
demiurg
Гость
« Ответ #16 : Сентябрь 19, 2011, 21:01 »

Цитировать
Ты их в функции что ли определял?

Код
C++ (Qt)
DatabaseAccessor::dbHost;
DatabaseAccessor::dbName;
 
DatabaseAccessor::DatabaseAccessor(QObject *parent)              
{
    db.setHostName(dbHost);
    db.setDatabaseName(dbName);
    ...
 

Аааа....дела...


Цитировать
Рекомендую любую книгу по C++. Подмигивающий

Да есть , читал. Всё какието примеры отдалёные от реальности. Нужна просто книга с примерами. А таких нет практически для высокого уровня, когда уже классы свои создавать надо. Каша в голове получается-  проблема в том что в С++ пришёл через asm->С. Там всё явно и прямолинейно. Правда и писанины в разы больше.

ЗЫ Спс, заработало, даже к базе конектица  Улыбающийся

Записан
BRE
Гость
« Ответ #17 : Сентябрь 19, 2011, 21:13 »

Каша в голове получается-  проблема в том что в С++ пришёл через asm->С. Там всё явно и прямолинейно. Правда и писанины в разы больше.
Поэтому и рекомендую вначале хорошо разобраться с инструментом (C++), а потом уже подходить к Qt.
А на счет пути... я тоже шел по тому же пути и могу сказать что на каждом шаге есть свои тонкости. Улыбающийся
Записан
Denis.Rassvetniy
Гость
« Ответ #18 : Сентябрь 21, 2011, 05:33 »

Цитировать
Рекомендую любую книгу по C++. Подмигивающий

Да есть , читал. Всё какието примеры отдалёные от реальности. Нужна просто книга с примерами. А таких нет практически для высокого уровня, когда уже классы свои создавать надо.
[/quote]

Рекомендую Р. Лафоре "Объектно-ориентированное программирование в C++"
Записан
demiurg
Гость
« Ответ #19 : Сентябрь 21, 2011, 09:12 »

Спс. Скачал, читаю...

Я вот тут подумал. Если сделать этот синглетон, то в той его реализации после отправки запроса придётся стопорить поток msleep*ами  и ждать ответа, т.е. новые данные с клиента , если и придут, то не обработаются - так а в чём тогда выигрыш? А если делать подключение к БД в каждом потоке , то всегда есть статичное время подключения к БД ( ну допустим 1-2 секунды). 

Или как то реализовать на сигналах и слотах. А как тогда сигнал передать именно тому объекту, от которого запрос(сигнал на запрос) пришёл  Непонимающий
Записан
BRE
Гость
« Ответ #20 : Сентябрь 21, 2011, 09:32 »

А если делать подключение к БД в каждом потоке , то всегда есть статичное время подключения к БД ( ну допустим 1-2 секунды). 
А ты используй пул потоков и для каждого потока используй свое подключение.
Тогда рабочие потоки не придется пересоздавать и переподключать к БД.
Записан
demiurg
Гость
« Ответ #21 : Сентябрь 21, 2011, 10:01 »

Т.е. не разрушать потоки после отключения клиентов... А при подключении связывать сигналы отключения и приёма со слотами определённого потока, выбранного из пула? Так получается? Но тогда нужно будет держать по 100 потоков( по клиенту на поток) - а сильно ли это нагрузит систему...

ЗЫ Да , видать надо было в другом разделе тему создавать...   
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #22 : Сентябрь 21, 2011, 10:35 »

Но тогда нужно будет держать по 100 потоков( по клиенту на поток) - а сильно ли это нагрузит систему...
Qt потоки != потоки системы. Cистемный поток существует только пока QThread находится в run.
QThread до start() и после finished() из системных ресурсов потребляет только немного памяти.
Записан
BRE
Гость
« Ответ #23 : Сентябрь 21, 2011, 10:55 »

Т.е. не разрушать потоки после отключения клиентов... А при подключении связывать сигналы отключения и приёма со слотами определённого потока, выбранного из пула? Так получается? Но тогда нужно будет держать по 100 потоков( по клиенту на поток) - а сильно ли это нагрузит систему...
Не нужно ничего разрушать и никого отключать. Улыбающийся
Ты сразу создаешь несколько рабочих потоков (например 4 или 10 или 25 Улыбающийся ) и открываешь для каждого свое подключение.
Пока работы нет, эти потоки спят. Появился запрос к БД ты кладешь его в очередь, первый свободный поток просыпается и начинает его обрабатывать. По окончании обработки запроса этот поток заснет, если других запросов в очереди нет или возьмет очередной запрос из очереди.

Записан
demiurg
Гость
« Ответ #24 : Сентябрь 21, 2011, 11:18 »

Ааа, даже так... То что надо. А очередь можно реализовать перебором QList или QMap ? Т.е. переираешь теже 25 потоков и ищеш первый который свободный, например ввести переменную , которая покажет что поток свободен.
Записан
BRE
Гость
« Ответ #25 : Сентябрь 21, 2011, 11:25 »

Ааа, даже так... То что надо. А очередь можно реализовать перебором QList или QMap ? Т.е. переираешь теже 25 потоков и ищеш первый который свободный, например ввести переменную , которая покажет что поток свободен.
Доверь поиск свободных потоков ОС.
Почитай:
http://www.prog.org.ru/topic_16083_15.html
http://www.prog.org.ru/topic_14426_60.html
Записан
demiurg
Гость
« Ответ #26 : Сентябрь 21, 2011, 12:00 »

Хм, не уловил ,так сказать, идеи. Работать через   QThreadPool?

Сейчас в принципе работает так( но пока и нет 100 подключений)

Код:
void EchoServer::incomingConnection(int socketDescriptor) {
    EchoThread *thread = new EchoThread(socketDescriptor, this);
    connect(thread, SIGNAL(finished()), this, SLOT(removeThread()),
            Qt::DirectConnection);
    m_threads.append(thread);
    thread->start();
}

void EchoServer::removeThread(){
    EchoThread *thread = qobject_cast<EchoThread*>(sender());
    m_threads.removeAt(m_threads.indexOf(thread));
    thread->deleteLater();
}

Это пример из Земского  , для чайников  Смеющийся  Мне подходит( Пока что. Но думаю метод RUN и слоты связанне с ним не поменяются)  .
Получается , вместо удаления потока мы просто его "освобождаем", но как это сделать  -я не понял. ЧайникСсс  Улыбающийся А есть хотябы сырой пример?  - чтобы начать "копать" ...
Записан
BRE
Гость
« Ответ #27 : Сентябрь 21, 2011, 12:42 »

Темы не дочитал до конца? Улыбающийся
Там и примеры есть и наброски.
Записан
demiurg
Гость
« Ответ #28 : Сентябрь 21, 2011, 14:00 »

Дочитал вот сейчас. Стало оформляться.

Получается в основном потоке принимаю подключения и заношу в очередь( например в QList) , и шлю сигнал всем потокам , что очередь не пустая. По очереди возникают слоты, в которых обрабатываем эту очередь, изымая клиентов из очереди ( а как быть с тем что может опять возникнуть вызов) . После окончания работы(например в слоте отключения клиента от сервера)  вызываем метод wait который "усыпляет поток". ТАк? Или всё же всё сложнее ?  
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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