Re[25]: Требуется Anatolix...
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 08.08.02 04:50
Оценка:
Когда первый раз сталкиваешься с мультипоточностью — это первые грабли на которые наступаешь. А я обычнов таких случаюях autolocker'ом пользуюсь — принцип такой же как и у смартпоинтера — в деструкторое Unlock
Re[26]: Требуется Anatolix...
От: Slayer Россия  
Дата: 08.08.02 04:52
Оценка:
Здравствуйте Denis, Вы писали:

Да красивое решение! И запись покороче будет — класс только церлять надо будет где-нить...

D>Когда первый раз сталкиваешься с мультипоточностью — это первые грабли на которые наступаешь. А я обычнов таких случаюях autolocker'ом пользуюсь — принцип такой же как и у смартпоинтера — в деструкторое Unlock



D>Здравствуйте Slayer, Вы писали:


S>>Здравствуйте Denis, Вы писали:


D>>>Странно, такое впечатление, что все задачи на одно и тоже.... а если exception случится в AddInternal.... а вот про "одной из класса" — так это не обязательно — если в одном месте пользуются(а тут не написано другого) то ничего и не будет....


S>>Ага. Похожи все вопросы. И об ответе я почему-то также подумал, а вот о вынесенной критической секции нет.

S>>Вопрос: А как бы тогда красиво переписать этот код?(try...catch? Interlocked...?)
Re[24]: Требуется Anatolix...
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 04:54
Оценка:
Здравствуйте Denis, Вы писали:

D>Странно, такое впечатление, что все задачи на одно и тоже.... а если exception случится в AddInternal.... а вот про "одной из класса" — так это не обязательно — если в одном месте пользуются(а тут не написано другого) то ничего и не будет....


Да это иногда надо учитывать хотя достаточно редко.
Обычно библиотеки которые активно работают
с паралельностью не используют Exceptiионов
т.к. они плохо сочетаются с многопоточностью.
Плохо прокинутый exception обычно сразу завершает
дополнительный поток. Тогда как в основном потоке
он отображается пользователя тот нажимает OK
и все продолжается.

Но если это нужно то надо писать приблизительно
следующую вещь.

class LockUnlock
{
public:
LockUnlock(CriticalSection& S) : CS(S) {СS.Lock()};
~LockUnlock(CriticalSection& S) {СS.Unlock()};
private:
CriticalSection& CS;
}

И блокировать вот так:

void MyCollection::AddItem(void *ptr)
{
LockUnlock S(m_CriticalSection);
AddInternal(ptr);
}
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[5]: Требуется Anatolix...
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 04:58
Оценка:
Здравствуйте Slayer, Вы писали:

S>И я подумал что должно быть че-нить вроде объявления функции с forward:

S>procedure Proc();forward;
S>Я не прав?

Сейчас даже в функциях это обычно не используется,
просто функцию записываешь в разделе interface безо
всяких forward-ов и все.

Для классов это никогда не использовалось
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[25]: Требуется Anatolix...
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 08.08.02 04:59
Оценка:
Не согласен про редко — MFC довольно часто любит чем нить покидаться, да и в С++ я люблю что бы new & malloc кидали exception. — нету тут связи между много поточностью и исключениями. Плохокинутый exception — завершает всё приложение, а не поток =), особенно если приложение не многопоточное. =)
Re[26]: Требуется Anatolix...
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 05:15
Оценка:
Здравствуйте Denis, Вы писали:

D>Не согласен про редко — MFC довольно часто любит чем нить покидаться, да и в С++ я люблю что бы new & malloc кидали exception. — нету тут связи между много поточностью и исключениями. Плохокинутый exception — завершает всё приложение, а не поток =), особенно если приложение не многопоточное. =)


Позволю не согласится, поток просто дохнет без слов и все,
сам проверял, ну очень у меня многопоточная среда.

MFC кстати нельзя назвать хорошей системой которая
кидается exception-ами. Там почти все функции как в
WinAPI имеют коды возврата. Хотя бы на VCL посмотреть
где exception-ы даже почти ловить не надо их библиотека
сама обрабатывает и показывает юзеру в виде сообщения,
очень удобно.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[4]: Требуется Anatolix...
От: Igor Trofimov  
Дата: 08.08.02 06:44
Оценка:
A>В pascal если мы предварительно описали класс
A>мы обязаны его определить до конца модуля.
A>Не совсем понятное, но раздражающее ограничение.

А по-моему даже жестче... Мы должны развернуть этот forward ДО ОКОНЧАНИЯ БЛОКА type.

Т.е.

type
TMyClasds = class;


type
TMyClass = class(TCOmponent);

уже не катит.

Как и все, могу ошибаться Проверять лень.
Re[2]: Хех, может вопрос по ASP+MS SQL подкинуть? :)
От: BoikoRoman  
Дата: 08.08.02 10:12
Оценка:
Здравствуйте 4auHuK, Вы писали:


HK> Set rs1 = conn.Execute("SELECT * FROM #T1")

HK> Set rs2 = conn.Execute("SELECT * FROM #T2") '<--- тут ошибка выполнения
HK> Set rs3 = conn.Execute("SELECT * FROM #T3") %>

Кажется мне, что вопрос является ритарическим (не требующим ответа), но все равно хочется ответить.

Ошибка врзникает на самом деле здесь

Set rs1 = conn.Execute("SELECT * FROM #T1")

метод Execute предназначен для выполнения SQL выражений, которые НЕ ВОЗВРАЩАЮТ РЕЗУЛЬТАТ (набор записей),
чтобы ошибки не было надо указывать SQL выражение в методе ОРЕN рекордсета (еще необходимо связать рекордсет с соединением).
Re[2]: Хех, может вопрос по ASP+MS SQL подкинуть? :)
От: Lloyd Россия  
Дата: 08.08.02 10:27
Оценка:
Здравствуйте 4auHuK, Вы писали:


HK> Set rs1 = conn.Execute("SELECT * FROM #T1")

HK> Set rs2 = conn.Execute("SELECT * FROM #T2") '<--- тут ошибка выполнения
HK> Set rs3 = conn.Execute("SELECT * FROM #T3") %>

HK>Вопрос: почему, такой простой код дает ошибку в указаном месте?


А разво одновременно может быть открыто несколько рекордсетов?
Re[24]: Требуется Anatolix...
От: IT Россия linq2db.com
Дата: 08.08.02 11:32
Оценка:
Здравствуйте Denis, Вы писали:

D>Странно, такое впечатление, что все задачи на одно и тоже.... а если exception случится в AddInternal.... а вот про "одной из класса" — так это не обязательно — если в одном месте пользуются(а тут не написано другого) то ничего и не будет....


Исключения мы уже проехали, поэтому я и не сомневался, что о них будет речь, но услышать я хотел именно вот это:

A>>Здесь не стоит выносить critical section за класс, т.к. получается, что если я заблокировал один экземпляров, то все остальные в этот момент стоят курят, хотя могли бы работать. Надо сделать CriticalSection одной из переменных класса(не статистической)


Из чего мы делаем вывод о знании предмета и ставим +
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Требуется Anatolix...
От: IT Россия linq2db.com
Дата: 08.08.02 11:46
Оценка:
Здравствуйте Anatolix, Вы писали:

A>Здравствуйте IT, Вы писали:


IT>>Здравствуйте Anatolix, Вы писали:

IT>>Что такое STA и MTA и какая между ними разница?

A>Это так называемые апартаменты. COM берет на себя заботу о синхронизации, если я передаю интерфейс из одного апартамента в другой, то он на самом деле маршалится и в другом апартаменте я получаю не сам интерфейс а заглушку которая сериализует вызовы.


Утверждение почти верное, но ответа на вопрос нет. Так в чём разница между STA и MTA?
Если нам не помогут, то мы тоже никого не пощадим.
Re[25]: Требуется Anatolix...
От: Denis Россия http://blogs.gotdotnet.ru/personal/Denis
Дата: 08.08.02 11:57
Оценка:
странно тогда задан вопрос — это как раз то, что называется "плохим" собеседованием — когда спрашивающий не умеет правильно задавать вопросы =(. Из вопроса этого и не следовало — таким же успехом можно предположить, что одна и таже CS используется для различных частей — и тогда именно так и поступают....



Здравствуйте IT, Вы писали:

IT>Здравствуйте Denis, Вы писали:


D>>Странно, такое впечатление, что все задачи на одно и тоже.... а если exception случится в AddInternal.... а вот про "одной из класса" — так это не обязательно — если в одном месте пользуются(а тут не написано другого) то ничего и не будет....


IT>Исключения мы уже проехали, поэтому я и не сомневался, что о них будет речь, но услышать я хотел именно вот это:


A>>>Здесь не стоит выносить critical section за класс, т.к. получается, что если я заблокировал один экземпляров, то все остальные в этот момент стоят курят, хотя могли бы работать. Надо сделать CriticalSection одной из переменных класса(не статистической)


IT>Из чего мы делаем вывод о знании предмета и ставим +
Re[4]: Требуется Anatolix...
От: IT Россия linq2db.com
Дата: 08.08.02 11:57
Оценка:
Здравствуйте Anatolix, Вы писали:

A>>>COM / ATL — хорошо — 1 год


IT>>Ты хочете (Вы хотишь) передать клиентской программе расширенную информацию об ошибке из COM сервера, написанного на ATL. Какие средства библиотеки и технологии Вы будете использовать.


A>надо реализовать какой-то интерфейс, имя без подсказки не помню


Плохо дело. Сам интерфейс называется IErrorInfo, его имплементация полностью генерируется визардом. Т.е. если бы ты использовал ATL интенсивно, то этот интерфейс у тебя всегда был бы перед глазами.

Для формирования сообщения об ошибке используетяся метод из семейства CComCoClass::Error.

Тогда ещё вопрос.

Каким образом в COM реализуется механизм рассылки событий?
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Требуется Anatolix...
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 11:57
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте Anatolix, Вы писали:


IT>Утверждение почти верное, но ответа на вопрос нет. Так в чём разница между STA и MTA?


STA — Single threaded apartament в нем всегда выполняется
1 поток, в MTA могут быть много.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[4]: Требуется Anatolix...
От: IT Россия linq2db.com
Дата: 08.08.02 11:58
Оценка:
Здравствуйте Anatolix, Вы писали:

IT>>Имеется 300k дезассемблированной кода. По каким отличительным признакам можно определить на каком языке высокого уровня написана программа.


A>Несколько прямых признаков(метка компилятора, сигнатуры библиотек)

A>И много косвенных(конвенция вызовов(хорошо видно кто сохраняет регистры и чистит стек), формат строк(asciiz или pascal) )

Вопросов нет
Если нам не помогут, то мы тоже никого не пощадим.
Re[26]: Требуется Anatolix...
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 12:00
Оценка:
Здравствуйте Denis, Вы писали:

D>странно тогда задан вопрос — это как раз то, что называется "плохим" собеседованием — когда спрашивающий не умеет правильно задавать вопросы =(. Из вопроса этого и не следовало — таким же успехом можно предположить, что одна и таже CS используется для различных частей — и тогда именно так и поступают....


А это есть хороший стиль? если ты там где то внутри пользуешь
глобальную арену памяти например то лочь ее отдельно. В идеале
у нее должен быть свой mutex и он должен быть внутри класса арены.

ООП очень хорошо сочетается с многопоточностью.
Один объект один Mutex
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[4]: Требуется Anatolix...
От: IT Россия linq2db.com
Дата: 08.08.02 12:03
Оценка:
Здравствуйте Anatolix, Вы писали:

A>Pascal


A>type MyClass=class;

A>(это в Object Pascal от Delphi, в классическом используется ключевое слово object а не class)

А как быть, если нужно рекурсивное использование классов, определённых в разных модулях? Т.е., например, в методе M1() класса A нужно работать с классамом B. А в классе B, в методе M2() нужно работать с классом A.
Если нам не помогут, то мы тоже никого не пощадим.
Re[5]: Требуется Anatolix...
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 12:03
Оценка:
Здравствуйте IT, Вы писали:

IT>Каким образом в COM реализуется механизм рассылки событий?


Объект который хочет получать событие реализует интерфейс
и передает его объекту который рассылает событие.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[5]: Требуется Anatolix...
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 08.08.02 12:08
Оценка:
Здравствуйте IT, Вы писали:

IT>Здравствуйте Anatolix, Вы писали:


IT>А как быть, если нужно рекурсивное использование классов, определённых в разных модулях? Т.е., например, в методе M1() класса A нужно работать с классамом B. А в классе B, в методе M2() нужно работать с классом A.


А никак. Ты даже uses там рекурсивный не имеешь право написать.
это тебе не заголовки в C++. Там к моменту компиляции одного
модуля нужно иметь скомпилированный tpu от другого модуля
(издержки соединения интерфейса и реализации в одном файле).
Понятно что при компиляции 2 файлов какой-то из них компилится
первым и в этот момент он не сможет поюзать второй.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[4]: Требуется Anatolix...
От: IT Россия linq2db.com
Дата: 08.08.02 12:08
Оценка:
Здравствуйте Anatolix, Вы писали:

A>>>MFC — хорошо — 1 год


IT>>Если представить архитектуру Document/View в виде отношений один к одному/многим, как бы это выглядело? (не забудь и про CxxxFrame).


A>Sorry, но плохо помню такие вещи, уже семь лет не программировал с MFC


Ясно, не знал, да ещё забыл

Документ может представляться несколькими фреймами (несколькими MDI оконами) и несколькими view. Фрейм может включать несколько view.
Если нам не помогут, то мы тоже никого не пощадим.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.