Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, lazy_walrus, Вы писали:
D>>>Может быть они и нормальные, только вот в COM о них надо постоянно думать... _>>Постоянно думать о подсчёте ссылок надо в C++. В языках с поддержкой IUnknown на уровне компилятора (напр. Delphi) это делается автоматически. MM>Проблемы не в том, чтобы автоматизировать вызовы AddRef и Release. Проблема в том, как быть уверенным, что всё это согласуется с внешним кодом, который не ты пишешь и не ты поддерживаешь.
Если внешний код корректно делает addref и release, то какая тебе разница? А если неорректно, то опять нет разницы несколько корректно это делаешь ты или компилятор за тебя.
Re[15]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, gandjustas, Вы писали:
G>Если внешний код корректно делает addref и release, то какая тебе разница? А если неорректно, то опять нет разницы несколько корректно это делаешь ты или компилятор за тебя.
Правильно. Поэтому нафиг reference counting. Другого я и не говорил.
Re[16]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, gandjustas, Вы писали:
G>>Если внешний код корректно делает addref и release, то какая тебе разница? А если неорректно, то опять нет разницы несколько корректно это делаешь ты или компилятор за тебя. MM>Правильно. Поэтому нафиг reference counting. Другого я и не говорил.
Как раз наоборот, нужно делать свое дело (addref и release) и не париться как делают подсчет ссылок компоненты.
Re[11]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>А тот же компилятор C# — я (хотя и пишу меньше двух месяцев) уже натыкался на конструкции которые VS2010 может откомилировать, а 2008 тупит — надо подсказывать.
Можно подробнее?
Re[11]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>И это видно по допиливанию такой тривиальной вещи как IntPtr. Сложно было сразу его сделать полноценную реализацию что ли?
А что с текущей не так? Да и вообще в C# есть нормальные указатели.
Re[12]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, fddima, Вы писали: F>Здравствуйте, Коваленко Дмитрий, Вы писали: КД>>И это видно по допиливанию такой тривиальной вещи как IntPtr. Сложно было сразу его сделать полноценную реализацию что ли? F> А что с текущей не так? Да и вообще в C# есть нормальные указатели.
Сложения IntPtr с целыми числами. По-моему оно отсутствует как класс. Какой-то зародыш появился в NET4.
При том при всем, что они юзают IntPtr для указания адреса памяти. Ну так сразу и добавили бы к нему все, что нужно для счастья.
Нет возможности определить верхнее/нижнее значения IntPtr (иногда нужно для контроля переполнения)
Вообщем, я плюнул, и накатал свои алгоритмы для IntPtr. Текущий вариант (без претензий на идеал) выглядит так:
Нормальные указатели — это в unsafe. Так? Или я что то пропустил?
Еще этот Marshal, который не понимает беззнаковые числа. Ну сложно было что ли сразу замутить? Чтобы любой, кто пришел с плюсов, почувствовал себя как дома. Нет — нехай помучается. Очередная надстройка c unsafe методами. Там как раз нормальные указатели юзаются
Сегодня разбирался с сериализацией. Опять какая-та лажа. Нафига мне нужно указывать (километровые) типы — выводите из значений параметров! C# же позволяет. Опять свой код.
Скрытый текст
public static class serialization_utils
{
public static void read_value<T>(SerializationInfo si,string name,out T value)
{
Debug.Assert(si!=null);
Debug.Assert(name!=null);
Debug.Assert(name!="");
value=(T)si.GetValue(name,typeof(T));
}//read_value
//-----------------------------------------------------------------------public static void write_value<T>(SerializationInfo si,string name,T value)
{
Debug.Assert(si!=null);
Debug.Assert(name!=null);
Debug.Assert(name!="");
si.AddValue(name,value,typeof(T));
}//write_value
}//class serialization_utils
Во. Меня еще заколбасило от того, что StringBuilder.Clear появился только в NET4. Это жесть
Нормальных алгоритмов поиска по ключу в List я не нашел. Нужны алгоритмы которые бы работали с (а-ля) IComparer<T1,T2>. Плохо искал? Опять свой код.
---
Наверное, я где то загнался. Но по-другому желаемое пока реализовать не удается
Да, это всего лишь бурчание по поводу того, что "опять все надо делать самому, своими руками"
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[13]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Наверное, я где то загнался. Но по-другому желаемое пока реализовать не удается
КД>Да, это всего лишь бурчание по поводу того, что "опять все надо делать самому, своими руками"
Что же ты такое реализовать пытаешься и главное зачем?
Re[12]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, Lloyd, Вы писали: L>Здравствуйте, Коваленко Дмитрий, Вы писали: КД>>А тот же компилятор C# — я (хотя и пишу меньше двух месяцев) уже натыкался на конструкции которые VS2010 может откомилировать, а 2008 тупит — надо подсказывать. L>Можно подробнее?
Воспроизвести это можно так.
Скрытый текст
using System;
using System.Collections.Generic;
////////////////////////////////////////////////////////////////////////////////interface IProcessor2<T1,T2>
{
};
////////////////////////////////////////////////////////////////////////////////
//class utilsclass utils
{
public static void exec<T1,T2>(IList<T1> list,T2 key,IProcessor2<T1,T2> proc)
{
}
}//utils
////////////////////////////////////////////////////////////////////////////////
//processorsclass TProcessor:IProcessor2<string,int>,IProcessor2<Guid,int>
{
};//class TProcessor
////////////////////////////////////////////////////////////////////////////////class Program
{
static int Main()
{
var list_str=new List<string>();
var list_guid=new List<Guid>();
var proc=new TProcessor();
int n=0;
//VS2010 - ok.
//VS2008 - fail
//Ошибка 1 Аргументы-типы для метода
//"utils.exec<T1,T2>(System.Collections.Generic.IList<T1>, T2, IProcessor2<T1,T2>)"
//не должны определяться по использованию. Попытайтесь явно определить аргументы-типы.
utils.exec/*<string,int>*/(list_str,n,proc);
utils.exec/*<Guid,int>*/(list_guid,n,proc);
return 0;
}//Main
}//class Program
Не спрашивай — "а нафига я засунул в один класс две разных реализации IProcessor2?". Так получилось
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[12]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>>>1. при нормальном подходе с ними никто не возится. как не возятся с голыми указателями на память, к примеру. MM>>>Нормальный подход — это какой? КД>>1. смарт-указатели. с правильной реализацией. или это уже не актуально? КД>>2. правильные принципы владения объектами. У COM они нормальные. MM>Правильное на правильном. Вот это и называется возиться. Всегда нужно применять только правильное и только с правильной реализацией. А мне нравится просто создавать объекты, без оберток, борющихся с языком.
Ты не поверишь — я вообще не парюсь с такими вещами. Последние траблы были так давно, что я уже забыл когда именно Правда опять же — я по-большому счету варился в собственном котле. С UI-шным ActiveX я соприкасался только один раз. Когда прикручивал Forms от офиса к своей системе. Из чужих COM-ов только ScriptControl+MSXML+ADODB. Наверное из-за этого минимализма у меня все и работало. Внутри же, все, то есть абсолютно все (что движется) — на счетчиках ссылок. Плюс жесточайший контроль обнулений/освобождений и прочего, что может намекать на утечку ресурсов. На плюсах по-другому писать как-то тяжко. Но зато спишь спокойно.
А я вот сейчас морально готовлюсь бороться с Dispose. Конкретнее — запрещать его вызов, пока работает один из методов объекта.
То что при подсчете ссылок делается автоматом (тот кто вызывает метод объект, удерживает его в памяти), на .NET прийдется реально городить: try/finally + CER. В КАЖДОМ PUBLIC-МЕТОДЕ!
Подобная защита предоставляется SafeHandle. Между вызовами DangerousAddRef/DangerousRelease — хоть обвызывайся Dispose. Но, если был вызов Dispose, последний DangerousRelease освободит объект.
--
Но я пока не уверен, что я тут все правильно понимаю. Хотя, как защиту от многопоточного дурака, я думаю такое все таки прийдется делать
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[12]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>То что при подсчете ссылок делается автоматом (тот кто вызывает метод объект, удерживает его в памяти), на .NET прийдется реально городить: try/finally + CER. В КАЖДОМ PUBLIC-МЕТОДЕ!
Это почему же?
Re[14]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>То что при подсчете ссылок делается автоматом (тот кто вызывает метод объект, удерживает его в памяти), на .NET прийдется реально городить: try/finally + CER. В КАЖДОМ PUBLIC-МЕТОДЕ! MM>Это почему же?
Опппа. А что в .NET можно замутить триггеры на вызовы/завершения методов?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[15]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, MxMsk, Вы писали:
MM>>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>>То что при подсчете ссылок делается автоматом (тот кто вызывает метод объект, удерживает его в памяти), на .NET прийдется реально городить: try/finally + CER. В КАЖДОМ PUBLIC-МЕТОДЕ! MM>>Это почему же?
КД>Опппа. А что в .NET можно замутить триггеры на вызовы/завершения методов?
А зачем тебе?
Re[13]: [ANN] WinRT - новое компонентное API для Windows 8
КД>Во. Меня еще заколбасило от того, что StringBuilder.Clear появился только в NET4. Это жесть
На StringBuilder наезд совершенно не по делу. До NET4 можно было просто Length в 0 установить, и получить тот же Clear. Или тебе принципиально метод нужен?
Re[14]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, hi_octane, Вы писали:
КД>>Во. Меня еще заколбасило от того, что StringBuilder.Clear появился только в NET4. Это жесть
_>На StringBuilder наезд совершенно не по делу. До NET4 можно было просто Length в 0 установить, и получить тот же Clear. Или тебе принципиально метод нужен?
И получается — чтобы код компилировался и там и там, про Clear можно забыть. Нафиг его тогда вообще добавили? Короче, я юзаю установку нуля. А наезд чисто на изначальный интерфейс — Clear должен был быть с самого рождения.
Я вообще сижу под VS2010 и генерирую код под NET4. А 2008 (NET3.5) я юзаю чисто как средство для доп. проверок. Привычка такая — чем нибудь еще откомпилировать и проверить. Вот и обнаруживаются такие вот забавные вещи.
---
Опять же. Заморочка с двумя компиляторами — это мои личные тараканы. На плюсах я в качестве альтернативы юзал BCB5. Но он у меня (окончательно) рехнулся за пару месяцев до релиза
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, Gollum, Вы писали:
G> Некоторой частью эти расширения похожи на расширения managed C++, но не нужно их путать. WinRT не использует CLR, и несмотря на то, что синтаксис местами одинаковый (например, Search::QueryOptions^), в WinRT это означает совсем другое.
Одна синтаксическая конструкция имеющая разный смысл при разных ключах компилятора (то есть по сути два разных языка) очевидно один из самых быстрых путей к полному .....
И вопрос тут не в том, что ребята решили создать новый COM. Может он и нужен для низкоуровневых работ, а именно в том, что они решили продлить агонию С++ превратив его из кошмарного франкенштейна (чего стоит синтаксис лямбд) с замусоренным синтаксисом в нечто совсем уж убожеское. Надо было создавать новый язык. Пусть низкоуровневый, но новый.
И лично я считаю, что это может очень плохо сказаться на отрасли в целом и на компании MS в частности.
Печально
Re[15]: [ANN] WinRT - новое компонентное API для Windows 8
Здравствуйте, MxMsk, Вы писали:
MM>Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>>Опппа. А что в .NET можно замутить триггеры на вызовы/завершения методов? MM>Какую задачу решаем?
"запрещать (или откладывать) вызова Dispose, пока работает один из методов объекта"
То есть запретить другим потокам освобождать объект, пока его юзает другой поток.
Речь идет о дополнительной защите. Понятно, что потоки сами должны предотвращать такое безобразие. Но тем не менее.
Про lock(...){} я знаю. Но по-моему можно обойтись и без этой синхронизации. Такая задача, я думаю, вполне решабельна на уровне ... счетчика ссылок и interlocked-функций
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[3]: [ANN] WinRT - новое компонентное API для Windows 8
Всё же, я думаю, это в раздел Win32 надо было. Потому что вот меня, например, больше беспокоит вопрос: зачем это всё, в смысле, какую цель преследует этот WinRT и какие задачи/проблемы призван решить? Почему не .Net просто? Они же могли сказать, мол, с сегодняшнего дня все, кто хотят кодить прикладные вещи, будете кодить их на C#, VB или на худой конец C++/CLI, а всякие там MFC и вообще нативные вещи объявляем устаревшими и оставляем только для всяческих системных разработок. И всё, всем сразу стало бы понятно, что к чему. Но зачем нужен новый C++? Зачем нужен COM (не важно в каком виде), если есть .Net? Короче, может кто-нибудь вразумительно ответить на эти вопросы? Если вопрос не понятен, тогда спрошу конкретнее. Представим, что я технический директор софтовой компании, которому заказали определённый софт написать, ну, скажем, аналог какого-нибудь там Office, вопрос: на чём его писать? Я ведь могу взять C# и не парится, или взять MFC и опять же не парится, или могу взять голый Windows API, если я конченный извращенец, и получать своё извращенческое удовольствие, потому что я знаю, что в итоге с помощью данных инструментов я смогу сделать всё, что мне нужно. Но внезапно я узнаю, что появился какой-то там ещё WinRT, а чем он лучше для моей задачи, — мне не понятно, что мне делать?