Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2017, 12:26   #11
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
У


Указатель, с кастомным удалятором. Но, кажется, unique_ptr не позволяет его задать. Тогда нужен класс-обвертка, который при удалении освободит ресурс. Напрямую хэндлы ресурса совать в указатель - очень плохая идея.
В unique_ptr кастомный удалятор задается вторым параметром при инстанцировании шаблона и инициализации.
Aoizora вне форума Ответить с цитированием
Старый 19.06.2017, 12:31   #12
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Aoizora Посмотреть сообщение
В unique_ptr кастомный удалятор задается вторым параметром при инстанцировании шаблона и инициализации.
Тогда, теоретически в него можно хранить хендл бд ... но это рисковано и вобщем не переносимо, мало ли какой хендл будет через 10 лет? Вдруг захотите на ардуино запустить, где указатели 16 бит?
...вобщем не рекомендуется все это - сделать класс (можно и шаблон) - обвертку, который удаляет ресурс и имеет оператор приведения типа в него. А указатель уже на обвертку.
alexzk вне форума Ответить с цитированием
Старый 19.06.2017, 13:12   #13
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
удалить же забыли...
Вообще-то функция называется GetInstance - с чего бы там чего-то удалять? Да и вообще, суть была как из указателя получить ссылку.

Цитата:
Сообщение от alexzk Посмотреть сообщение
но это рисковано и вобщем не переносимо, мало ли какой хендл будет через 10 лет?
Какая разница? Функция удаления изменится так же как и хендл, так что все будет переносимо. То, что поменяется тип хендла нам по барабану.
waleri вне форума Ответить с цитированием
Старый 19.06.2017, 13:13   #14
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вообще-то функция называется GetInstance - с чего бы там чего-то удалять? Да и вообще, суть была как из указателя получить ссылку.
Ну раз память в ней распределена, то должна быть где-то и удалена. Танцы с указатель->ссылка->указатель->удаление как минимум плохо пахнут.
alexzk вне форума Ответить с цитированием
Старый 19.06.2017, 22:54   #15
Aoizora
Заблокирован
 
Регистрация: 11.11.2016
Сообщений: 261
По умолчанию

Цитата:
Сообщение от alexzk Посмотреть сообщение
У


Указатель, с кастомным удалятором. Но, кажется, unique_ptr не позволяет его задать. Тогда нужен класс-обвертка, который при удалении освободит ресурс. Напрямую хэндлы ресурса совать в указатель - очень плохая идея.
Ок, указатель с кастомным удалятором заинтересовал меня. Так как я мало работал с БД, попробую различную архитектуру. Допустим, в базе много работников, и приложение должно расчитать какие-то сведения о них. То есть, по всей видимости, надо для каждого типа сотрудника создавать подкласс общего класса worker. Что делать с соединением с БД? При каждом инстанцировании подкласса открывать новое соединение, обернутое в unique_ptr? Насколько затратно по ресурсам открытие соединения?

Кроме того, может возникнуть такая проблема, что инстансов для работников будет много, и в каждом открыто свое соединение вместо использования одного глобального. Это очень нехорошо.
Aoizora вне форума Ответить с цитированием
Старый 20.06.2017, 04:50   #16
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Я делал так...Запускаю поток, в его функции открываю соединение, дальше бесконечный цикл, с проверкой некого глобального атомарного флага-сигнала, что всем потокам в проге пора закончится.

В цикле переодически проверяю приватный мембер-очередь, есть ли че новое (синхр.), если нет - то спимс, если есть .. (можно сделать на conditional variable, тогда вообще ЦП есть не будет).

Вобщем в очередь засовывается "запрос" из другого потока, содержащий sql текст и лямбду-ответ. Поток исполняет запрос и вызывает лямбду с полученым ответом (т.о. лямбда в контексте этого потока, так что должна учитывать это, при обработке результата), и все повторяем.

Т.о. собссно само "соединение" у вас оказывается локальной переменной внутри ф. потока, и ваще ниче морочить не нада. Калбеки вот те, можно организовать через некие статики в этом же файле, которые доступны только потоку-исполнителю.

Если необходимо синхронное исполнение запроса, тогда к "запросу" добавляется мембер ожидания некий, и сигналер. Поток-исполнитель его сигналит после вызова лямбды, а тот, кто вызвал запрос, просто ждет сигнала, сразу после вызова.

Последний раз редактировалось alexzk; 20.06.2017 в 04:55.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синглтон и паттерн. Что это такое и с чем его едят? (C#)) max_prorok Общие вопросы по программированию, компьютерный форум 21 22.03.2016 14:59
Запрос с параметром Claster Помощь студентам 0 11.06.2012 11:44
Синглтон. Исключение при вызове метода через глобальную точку доступа. clions C# (си шарп) 3 13.04.2012 21:09
Цикл с параметром Гузеля Паскаль, Turbo Pascal, PascalABC.NET 2 21.03.2012 20:59
Синглтон megachuhancer Общие вопросы Delphi 0 11.05.2010 13:23