Здравствуйте, iix, Вы писали:
iix>Всем привет. iix>Вот сижу и программирую клиента для одного IM и в одной функции получился извращенный до нельзя код. Хотелось бы чтобы вы предложиле более красивую реализацию данного кода:
Во, ПК, гляди (!) как искусно "юзаются" твои любимые деструкторы и RAII. Тут хоть кол на голове теши, но пока в библиотеке не напишут грамотную обертку народ будет мучаться, плакать, но жрать этот долбанный кактус.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, iix, Вы писали:
iix>>Здравствуйте, eao197, Вы писали:
E>>>Используй готовые библиотеки классов для работы с многопоточностью и синхронизацией. iix>>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS. LM>Как сказали выше есть кроссплатворменные библиотеки для этого.(например, в boost-е что было www.boost.org ), а во-вторых код итак не очень кроссплатформеный, т.к. встречаются LM>- CreateMutex LM>- TerminateThread
Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше. А кстати ты бы лучше предложил свой вариант без оберток а мы бы посмотрели и все бы поняли .
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, iix, Вы писали:
LM><scipped> iix>>Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше. LM>А в чем минусы готовых кросс-платформенных классов?
Я просто придерживаюсь идеологии все универсальное работае не очень быстро.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, iix, Вы писали: LM><scipped> LM>>>А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время iix>>А я никуда не спешу. Удовольствие надо растягивать. LM>Ты пишешь: LM>1. для себя( для удовольствия ) LM>2. на себя( самозанятый ) LM>3. на дядю
LM>Во 2 и 3 случае время деньги.В 1-ом случае — лучше приобретать правильные привычки сразу
Да я раньше не тратиль свое время на разные форумы а читал умные книжки. И времени было навалом. Кстати тебя наверно дядя заждался уже скорей отключайся от инета и доделывай ему программу для выключения компа
Здравствуйте, eao197, Вы писали:
E>Используй готовые библиотеки классов для работы с многопоточностью и синхронизацией.
Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.
Здравствуйте, iix, Вы писали:
iix>Здравствуйте, eao197, Вы писали:
E>>Используй готовые библиотеки классов для работы с многопоточностью и синхронизацией. iix>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.
Как сказали выше есть кроссплатворменные библиотеки для этого.(например, в boost-е что было www.boost.org ), а во-вторых код итак не очень кроссплатформеный, т.к. встречаются
— CreateMutex
— TerminateThread
Здравствуйте, iix, Вы писали:
iix>Здравствуйте, GlebZ, Вы писали:
GZ>>Неизвестно что имелось ввиду. Mutex если уже был создан, должен давать ошибку, и это есть нормальная ситуация. Он для этого и создается. А может это и исключительный случай. Без знания того что здесь автор хотел, не скажешь. GZ>>Поэтому лучше RAII. iix>Просто хотел спросить как иначе но красивше без этих if внутри if написать данную функцию. И как боротся с таким количеством проверок. Чтоли принимать таблетки против паранойй
Здравствуйте, iix, Вы писали:
<scipped> LM>>А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время iix>А я никуда не спешу. Удовольствие надо растягивать.
Ты пишешь:
1. для себя( для удовольствия )
2. на себя( самозанятый )
3. на дядю
Во 2 и 3 случае время деньги.В 1-ом случае — лучше приобретать правильные привычки сразу
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, GlebZ, Вы писали:
GZ>Вообще очень занятный код. Если мы терминировали потоки, то кто же удалять мутексы будет? Вобщем, здесь логика по самое нехочу.
Во первых мютекс создает основной поток, он же его и удалит, ничего сложного в етом нету . А логика вот в чем ето функция выполняется в основном потоке. Она создает два потока и для них создает 2 мютекса. Мютексы нужны для того чтобы ети два потоко отправляли и принимали данные по очереди. Вот и все
Здравствуйте, iix, Вы писали:
iix>Во первых мютекс создает основной поток, он же его и удалит,
Это как? Круто. iix>ничего сложного в етом нету . А логика вот в чем ето функция выполняется в основном потоке. Она создает два потока и для них создает 2 мютекса. Мютексы нужны для того чтобы ети два потоко отправляли и принимали данные по очереди. Вот и все
Эх молодежь. Использование terminate сродни пустить человеку пулю в лоб, вместо того чтобы просто попросить его выйти. И соответсвенно, придется расчленять труп и вывозить куда-то.
Точно так же, если ты в C++ убиваешь тред, то вся выделенная им память остается. Максимум, terminate может быть использован в системах 24x7 когда у тебя StackOverflow. Чтобы хоть что-то сохранить. Никто не знает в каком состоянии находится система, и существует большая вероятность, что произойдут утечки памяти выделенные потоками.
В данном случае желательно иметь некоторый event, с помощью которого основная функция оповещает потоки о том, что они не нужны. И вот только тогда, детерменированно освободив всю занятую память и задестроив все объекты, потоки должны корректно выйти.
Здравствуйте, iix, Вы писали:
iix>Здравствуйте, LuciferMoscow, Вы писали:
LM>>Здравствуйте, iix, Вы писали:
LM>><scipped> iix>>>Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше. LM>>А в чем минусы готовых кросс-платформенных классов? iix>Я просто придерживаюсь идеологии все универсальное работае не очень быстро.
Ты замятишь разницу в 1% случаев. Еще в меньшем проценте случаев эта разницу будет важна.
А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время
Здравствуйте, iix, Вы писали:
iix>Ну лан раскусили люблю я маненько помудится и написать свой код.
Судя по противоричивости пожеланий к написанию кода, Вы передергиваете, а именно любите
помудится
не мальнько, а как минимум — полноценно.
По делу — как уже грили Библиотеки много в чем помогают, кроме того, написание(использование готовых) оберток крайне положительно сказывается на красоте кода; RAII, как уже грили, — сильно упрощает управление ресурсами.
Если хочется своего и без оберток и чтоб красивого, то может надо попытаться на другом языке написать ?
Здравствуйте, srggal, Вы писали:
S>Здравствуйте, iix, Вы писали:
iix>>Ну лан раскусили люблю я маненько помудится и написать свой код.
S>Судя по противоричивости пожеланий к написанию кода, Вы передергиваете, а именно любите
помудится
не мальнько, а как минимум — полноценно.
S>По делу — как уже грили Библиотеки много в чем помогают, кроме того, написание(использование готовых) оберток крайне положительно сказывается на красоте кода; RAII, как уже грили, — сильно упрощает управление ресурсами.
S>Если хочется своего и без оберток и чтоб красивого, то может надо попытаться на другом языке написать ?
В этом и кайф что я не ищу легких путей. Вот скоро на уровне драйвера напишу IM.
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, GlebZ, Вы писали:
GZ>Вообще очень занятный код. Если мы терминировали потоки, то кто же удалять мутексы будет? Вобщем, здесь логика по самое нехочу.
Да нормальная логика. Мутексы надо закрыть после закрытия треда, который перед своим окончанием должен их освободить.
В общем, сначала создаем мутексы, потом треды, потом они ждут и отпускают мутексы, потом треды кончаются и извещают родителя, а он закрывает мутексы.
Здравствуйте, iix, Вы писали:
iix>Всем привет. iix>Вот сижу и программирую клиента для одного IM и в одной функции получился извращенный до нельзя код.
В каком смысле? В том что в нем ошибка на ошибке?
Здравствуйте, iix, Вы писали:
iix>Здравствуйте, iix, Вы писали:
iix>Может вам выслать еще одну функцию там также проверка за проверкой. Просто последнее время при программировании я слежу за выходными значениями каждой функции. Раньше было круто не парился я с этими проверками и код был компактнее а сейчач даже незнаю.............
Делай обертки. Делай. Это окупится. Меньше отладки будет.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, GlebZ, Вы писали:
GZ>Для того чтобы рассуждать красиво или не красиво, нужно знать что же делается в этих тредах. Пока мы не знаем какую задачу он выполняет, ничего сказать нельзя.
И все равно ее вызывать неприлично. Если не говорить о убиении потоков в чужом процессе, то ИМХО всегда можно сделать так, чтобы поток сам себя корректно завершал.
Здравствуйте, iix, Вы писали:
iix>Здравствуйте, eao197, Вы писали:
E>>Используй готовые библиотеки классов для работы с многопоточностью и синхронизацией. iix>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.
<scipped> iix>Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше.
А в чем минусы готовых кросс-платформенных классов?
iix> А кстати ты бы лучше предложил свой вариант без оберток а мы бы посмотрели и все бы поняли .
Зачем?! "Захват ресурса — есть инициализация"
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, VladD2, Вы писали:
VD>>Во, ПК, гляди (!) как искусно "юзаются" твои любимые деструкторы и RAII. Тут хоть кол на голове теши, но пока в библиотеке не напишут грамотную обертку народ будет мучаться, плакать, но жрать этот долбанный кактус.
E>Кстати да, есть на что посмотреть. Как на исключение, которое подтверждает правило. При использовании деструкторов и RAII этот код выглядел бы гораздо проще. E>И для другого правила этот пример так же служит исключением -- готовые библиотеки нужно использовать.
E>Ты еще не знаешь, во что подобными исключениями из правил можно программы на C# превратить
Я тоже как ты меня хлебом не корми, дай что-нибудь свое придумать.
Всем привет.
Вот сижу и программирую клиента для одного IM и в одной функции получился извращенный до нельзя код. Хотелось бы чтобы вы предложиле более красивую реализацию данного кода:
Здравствуйте, Kubyshev Andrey, Вы писали:
KA>Я бы сделал просто в таком стиле. Просто, но со вкусом:
KA>if (!....){ KA> DbgPrint ... KA> goto error; KA>} KA>... KA>error: KA>if (pingthrd) { KA> TerminateThread(pingthrd,0); KA> CloseHandle(pingthrd); KA>}
Жуть. Даже для С. Можно сделать функцию, что-то Deinintialize. И в ней по проверке handle==0 убивать. И без всяких goto. Сразу return.
KA>Если не просто и это С++ то исключения.
Неизвестно что имелось ввиду. Mutex если уже был создан, должен давать ошибку, и это есть нормальная ситуация. Он для этого и создается. А может это и исключительный случай. Без знания того что здесь автор хотел, не скажешь.
Поэтому лучше RAII.
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, iix, Вы писали:
iix>>Всем привет. iix>>Вот сижу и программирую клиента для одного IM и в одной функции получился извращенный до нельзя код. GZ>В каком смысле? В том что в нем ошибка на ошибке?
Да какойто пароноидальный код получился. Что со мной творится. Неужели я стал параноиком после прочтения книги Windows для профессионалов. Эти CloseHandel меня уже запарили. Последнии мой разработки так и кишат этими проверками. Черт кажется я потихоньку схожу с ума
Здравствуйте, GlebZ, Вы писали:
GZ>Неизвестно что имелось ввиду. Mutex если уже был создан, должен давать ошибку, и это есть нормальная ситуация. Он для этого и создается. А может это и исключительный случай. Без знания того что здесь автор хотел, не скажешь. GZ>Поэтому лучше RAII.
Просто хотел спросить как иначе но красивше без этих if внутри if написать данную функцию. И как боротся с таким количеством проверок. Чтоли принимать таблетки против паранойй
Может вам выслать еще одну функцию там также проверка за проверкой. Просто последнее время при программировании я слежу за выходными значениями каждой функции. Раньше было круто не парился я с этими проверками и код был компактнее а сейчач даже незнаю.............
Здравствуйте, Кирилл Лебедев, Вы писали:
КЛ>Здравствуйте, GlebZ, Вы писали:
GZ>>
GZ>> m_handle=0;
GZ>>
КЛ>Эта строка лишняя. CreateMutex и _beginthreadex сами инициализируют handle так, как надо.
Да не в етом суть вопроса пусть хот десять раз напищет a=a+1. Здесь вопрос не в оптимизации кода а в красоте и оригинальности
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Ну и правильно, что забыл. Нечего ее вызывать. Некрасиво это
Для того чтобы рассуждать красиво или не красиво, нужно знать что же делается в этих тредах. Пока мы не знаем какую задачу он выполняет, ничего сказать нельзя.
Здравствуйте, VladD2, Вы писали:
VD>Во, ПК, гляди (!) как искусно "юзаются" твои любимые деструкторы и RAII. Тут хоть кол на голове теши, но пока в библиотеке не напишут грамотную обертку народ будет мучаться, плакать, но жрать этот долбанный кактус.
Кстати да, есть на что посмотреть. Как на исключение, которое подтверждает правило. При использовании деструкторов и RAII этот код выглядел бы гораздо проще.
И для другого правила этот пример так же служит исключением -- готовые библиотеки нужно использовать.
Ты еще не знаешь, во что подобными исключениями из правил можно программы на C# превратить
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>И все равно ее вызывать неприлично. Если не говорить о убиении потоков в чужом процессе, то ИМХО всегда можно сделать так, чтобы поток сам себя корректно завершал.
Фактически да. В подавляющем количестве случаев можно выйти корректно, или некорректно, но детерменированое, через exception. Трудно придумать ситуацию где такое понадобится TerminateThread. И вообще, тут ошибка. Сразу не подумавши был, из-за вечернего времени. В случае чего должен быть не TerminateThread а _endthreadex.
Здравствуйте, GlebZ, Вы писали:
GZ>Здравствуйте, Pavel Dvorkin, Вы писали:
GZ>Фактически да. В подавляющем количестве случаев можно выйти корректно, или некорректно, но детерменированое, через exception. Трудно придумать ситуацию где такое понадобится TerminateThread. И вообще, тут ошибка. Сразу не подумавши был, из-за вечернего времени. В случае чего должен быть не TerminateThread а _endthreadex.
Ох, не надо. Так ты закончишь не тот тред, что запустил, а самого себя
Тред должен заканчиваться endthreadex в самом себе. И закрыть перед этим хендл. Или просто return. Перед этим он должен как-то уведомить родителя, чтобы тот сделал CloseHandle у себя (счетчик-то исходно равен 2). Если, конечно, он его не сделал сразу после запуска треда. Тогда вообще ничего не надо.
Здравствуйте, iix, Вы писали:
iix>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.
Серьезное основание
Особенно с учетом, что библиотеки и классы обертки как раз очень сильно облегчают перенос кода на другие ОС.
А если это еще и IM клиент, которому нужно поддерживать коммуникации, то очень рекомендую посмотреть в сторону ACE
-- там и многопоточности, и синхронизации, и коммуникациям уделяется самое пристальное внимание (для этого и написано). Да еще можно применить ACE_Reactor и ACE_Acceptor/ACE_Connector, тогда про ручное управление потоками можно будет совсем забыть.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, iix, Вы писали:
iix>>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.
E> E>Серьезное основание E>Особенно с учетом, что библиотеки и классы обертки как раз очень сильно облегчают перенос кода на другие ОС. E>А если это еще и IM клиент, которому нужно поддерживать коммуникации, то очень рекомендую посмотреть в сторону ACE
-- там и многопоточности, и синхронизации, и коммуникациям уделяется самое пристальное внимание (для этого и написано). Да еще можно применить ACE_Reactor и ACE_Acceptor/ACE_Connector, тогда про ручное управление потоками можно будет совсем забыть.
Ну лан раскусили люблю я маненько помудится и написать свой код.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, iix, Вы писали:
iix>>Здравствуйте, LuciferMoscow, Вы писали:
LM>>>Здравствуйте, iix, Вы писали:
LM>>><scipped> iix>>>>Как бы тебе по русски сказать ну чемь меньше готовых классов буду использовать тем лутше. LM>>>А в чем минусы готовых кросс-платформенных классов? iix>>Я просто придерживаюсь идеологии все универсальное работае не очень быстро. LM>Ты замятишь разницу в 1% случаев. Еще в меньшем проценте случаев эта разницу будет важна.
LM>А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время
А я никуда не спешу. Удовольствие надо растягивать.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, iix, Вы писали:
iix>>В этом и кайф что я не ищу легких путей. Вот скоро на уровне драйвера напишу IM.
E>Похоже, мне нужно поменять бомбочку на этой теме. В 'Юмор'.
Где бомба??? И что она означает. Кстати сайт прикольный и страничка Об авторе тоже. Особенно строка:
А изобретатель велосипедов -- потому, что меня хлебом не корми, дай что-нибудь свое придумать.
Здравствуйте, iix, Вы писали:
iix>Здравствуйте, LuciferMoscow, Вы писали:
LM>>Здравствуйте, iix, Вы писали: LM>><scipped> LM>>>>А твоя экономия на "спичках" в быстроте программы затянет разработку на большое время iix>>>А я никуда не спешу. Удовольствие надо растягивать. LM>>Ты пишешь: LM>>1. для себя( для удовольствия ) LM>>2. на себя( самозанятый ) LM>>3. на дядю
LM>>Во 2 и 3 случае время деньги.В 1-ом случае — лучше приобретать правильные привычки сразу
iix>Да я раньше не тратиль свое время на разные форумы а читал умные книжки. И времени было навалом. Кстати тебя наверно дядя заждался уже скорей отключайся от инета и доделывай ему программу для выключения компа
Кстати есть одна крутая формула для данного форума:
F=exp(x)-1;
x-это цифра внутри квадратных скобок нпр (Re[17]: Красота кода - 17)
F-это уровень флейма
Здравствуйте, iix, Вы писали:
iix>Где бомба??? И что она означает.
Если зайти на форум в браузере и со включенным отображением графики, то на самом первом сообщении этой темы ты увидишь иконку с маленькой бомбочкой. Это признак автомодерирования (если не ошибаюсь в терминах), т.е. кто-то из читателей проголосовал за перенос темы или ее части в другой форум.
iix> Кстати сайт прикольный и страничка Об авторе тоже.
Спасибо. Заходите еще
iix> Особенно строка: iix>
iix>А изобретатель велосипедов -- потому, что меня хлебом не корми, дай что-нибудь свое придумать.
.
И, как старый изобретатель велосипедов могу дать совет: изобретать нужно меньше. Самое сложное ведь не изобрести, а поддерживать, развивать и сопровождать (образно говоря, сложно не родить, а выростить). И чем больше кода за тебя сопровождают другие, тем лучше.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, iix, Вы писали:
iix>Не канает использование готовых библиотек так как этот проект будет в дальнейшем будет портироватся на другую OS.
Не позорься. Это же полный лам делать такие заявления.
Во-мервый, есть куча кросплатформных библиотек которые только упростят перенос твоего кода.
Во-вторых, тебе никто не запрещает написать эти библиотеки самостоятельно.
Твой аргумент о требованиях переносимости выглядит просто абсурдно, так как ты пользушся приципиально платформно-зависомой библиотекой (Win32).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, iix, Вы писали:
iix>Вот сижу и программирую клиента для одного IM и в одной функции получился >извращенный до нельзя код. Хотелось бы чтобы вы предложиле более красивую реализацию
засовываешь все в try-catch, делаешь обертку хендла которая проверяет на NULL (для отдельных хендлов должна проверять на INVALID_HANDLE_VALUE) и кидает исключение.
а лет 5 назад я бы написал через макросы
CHECK_AND_THROW( h = CreateMutex() );
Хотя для данного конкретного случая использовать обёртки (как советуют коллеги) — самое оно. Ручное закрытие хендлов еще понятно где-нибудь в ядре, когда код пишет дядька вроде Руссиновича, да ещё и на ассемблере, а не на С++ (как хорошо известно, компилятору доварять нельзя ).
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, iix, Вы писали:
iix>Да не в етом суть вопроса пусть хот десять раз напищет a=a+1. Здесь вопрос не в оптимизации кода а в красоте и оригинальности
Боюсь, что чем больше лишних строк, тем код менее красив. Зачем писать операторы, которые не нужны? Они только засоряют код и делают его менее компактным/красивым.