Когда первый раз сталкиваешься с мультипоточностью — это первые грабли на которые наступаешь. А я обычнов таких случаюях autolocker'ом пользуюсь — принцип такой же как и у смартпоинтера — в деструкторое Unlock
Да красивое решение! И запись покороче будет — класс только церлять надо будет где-нить...
D>Когда первый раз сталкиваешься с мультипоточностью — это первые грабли на которые наступаешь. А я обычнов таких случаюях autolocker'ом пользуюсь — принцип такой же как и у смартпоинтера — в деструкторое Unlock
D>Здравствуйте Slayer, Вы писали:
S>>Здравствуйте Denis, Вы писали:
D>>>Странно, такое впечатление, что все задачи на одно и тоже.... а если exception случится в AddInternal.... а вот про "одной из класса" — так это не обязательно — если в одном месте пользуются(а тут не написано другого) то ничего и не будет....
S>>Ага. Похожи все вопросы. И об ответе я почему-то также подумал, а вот о вынесенной критической секции нет. S>>Вопрос: А как бы тогда красиво переписать этот код?(try...catch? Interlocked...?)
Здравствуйте Denis, Вы писали:
D>Странно, такое впечатление, что все задачи на одно и тоже.... а если exception случится в AddInternal.... а вот про "одной из класса" — так это не обязательно — если в одном месте пользуются(а тут не написано другого) то ничего и не будет....
Да это иногда надо учитывать хотя достаточно редко.
Обычно библиотеки которые активно работают
с паралельностью не используют Exceptiионов
т.к. они плохо сочетаются с многопоточностью.
Плохо прокинутый exception обычно сразу завершает
дополнительный поток. Тогда как в основном потоке
он отображается пользователя тот нажимает OK
и все продолжается.
Но если это нужно то надо писать приблизительно
следующую вещь.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Slayer, Вы писали:
S>И я подумал что должно быть че-нить вроде объявления функции с forward: S>procedure Proc();forward; S>Я не прав?
Сейчас даже в функциях это обычно не используется,
просто функцию записываешь в разделе interface безо
всяких forward-ов и все.
Для классов это никогда не использовалось
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Не согласен про редко — MFC довольно часто любит чем нить покидаться, да и в С++ я люблю что бы new & malloc кидали exception. — нету тут связи между много поточностью и исключениями. Плохокинутый exception — завершает всё приложение, а не поток =), особенно если приложение не многопоточное. =)
Здравствуйте Denis, Вы писали:
D>Не согласен про редко — MFC довольно часто любит чем нить покидаться, да и в С++ я люблю что бы new & malloc кидали exception. — нету тут связи между много поточностью и исключениями. Плохокинутый exception — завершает всё приложение, а не поток =), особенно если приложение не многопоточное. =)
Позволю не согласится, поток просто дохнет без слов и все,
сам проверял, ну очень у меня многопоточная среда.
MFC кстати нельзя назвать хорошей системой которая
кидается exception-ами. Там почти все функции как в
WinAPI имеют коды возврата. Хотя бы на VCL посмотреть
где exception-ы даже почти ловить не надо их библиотека
сама обрабатывает и показывает юзеру в виде сообщения,
очень удобно.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
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 подкинуть? :)
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>Вопрос: почему, такой простой код дает ошибку в указаном месте?
А разво одновременно может быть открыто несколько рекордсетов?
Здравствуйте Denis, Вы писали:
D>Странно, такое впечатление, что все задачи на одно и тоже.... а если exception случится в AddInternal.... а вот про "одной из класса" — так это не обязательно — если в одном месте пользуются(а тут не написано другого) то ничего и не будет....
Исключения мы уже проехали, поэтому я и не сомневался, что о них будет речь, но услышать я хотел именно вот это:
A>>Здесь не стоит выносить critical section за класс, т.к. получается, что если я заблокировал один экземпляров, то все остальные в этот момент стоят курят, хотя могли бы работать. Надо сделать CriticalSection одной из переменных класса(не статистической)
Из чего мы делаем вывод о знании предмета и ставим +
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте Anatolix, Вы писали:
A>Здравствуйте IT, Вы писали:
IT>>Здравствуйте Anatolix, Вы писали: IT>>Что такое STA и MTA и какая между ними разница?
A>Это так называемые апартаменты. COM берет на себя заботу о синхронизации, если я передаю интерфейс из одного апартамента в другой, то он на самом деле маршалится и в другом апартаменте я получаю не сам интерфейс а заглушку которая сериализует вызовы.
Утверждение почти верное, но ответа на вопрос нет. Так в чём разница между STA и MTA?
Если нам не помогут, то мы тоже никого не пощадим.
странно тогда задан вопрос — это как раз то, что называется "плохим" собеседованием — когда спрашивающий не умеет правильно задавать вопросы =(. Из вопроса этого и не следовало — таким же успехом можно предположить, что одна и таже CS используется для различных частей — и тогда именно так и поступают....
Здравствуйте IT, Вы писали:
IT>Здравствуйте Denis, Вы писали:
D>>Странно, такое впечатление, что все задачи на одно и тоже.... а если exception случится в AddInternal.... а вот про "одной из класса" — так это не обязательно — если в одном месте пользуются(а тут не написано другого) то ничего и не будет....
IT>Исключения мы уже проехали, поэтому я и не сомневался, что о них будет речь, но услышать я хотел именно вот это:
A>>>Здесь не стоит выносить critical section за класс, т.к. получается, что если я заблокировал один экземпляров, то все остальные в этот момент стоят курят, хотя могли бы работать. Надо сделать CriticalSection одной из переменных класса(не статистической)
IT>Из чего мы делаем вывод о знании предмета и ставим +
Здравствуйте Anatolix, Вы писали:
A>>>COM / ATL — хорошо — 1 год
IT>>Ты хочете (Вы хотишь) передать клиентской программе расширенную информацию об ошибке из COM сервера, написанного на ATL. Какие средства библиотеки и технологии Вы будете использовать.
A>надо реализовать какой-то интерфейс, имя без подсказки не помню
Плохо дело. Сам интерфейс называется IErrorInfo, его имплементация полностью генерируется визардом. Т.е. если бы ты использовал ATL интенсивно, то этот интерфейс у тебя всегда был бы перед глазами.
Для формирования сообщения об ошибке используетяся метод из семейства CComCoClass::Error.
Тогда ещё вопрос.
Каким образом в COM реализуется механизм рассылки событий?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте IT, Вы писали:
IT>Здравствуйте Anatolix, Вы писали:
IT>Утверждение почти верное, но ответа на вопрос нет. Так в чём разница между STA и MTA?
STA — Single threaded apartament в нем всегда выполняется
1 поток, в MTA могут быть много.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
IT>>Имеется 300k дезассемблированной кода. По каким отличительным признакам можно определить на каком языке высокого уровня написана программа.
A>Несколько прямых признаков(метка компилятора, сигнатуры библиотек) A>И много косвенных(конвенция вызовов(хорошо видно кто сохраняет регистры и чистит стек), формат строк(asciiz или pascal) )
Вопросов нет
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте Denis, Вы писали:
D>странно тогда задан вопрос — это как раз то, что называется "плохим" собеседованием — когда спрашивающий не умеет правильно задавать вопросы =(. Из вопроса этого и не следовало — таким же успехом можно предположить, что одна и таже CS используется для различных частей — и тогда именно так и поступают....
А это есть хороший стиль? если ты там где то внутри пользуешь
глобальную арену памяти например то лочь ее отдельно. В идеале
у нее должен быть свой mutex и он должен быть внутри класса арены.
ООП очень хорошо сочетается с многопоточностью.
Один объект один Mutex
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
A>Pascal
A>type MyClass=class; A>(это в Object Pascal от Delphi, в классическом используется ключевое слово object а не class)
А как быть, если нужно рекурсивное использование классов, определённых в разных модулях? Т.е., например, в методе M1() класса A нужно работать с классамом B. А в классе B, в методе M2() нужно работать с классом A.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте IT, Вы писали:
IT>Каким образом в COM реализуется механизм рассылки событий?
Объект который хочет получать событие реализует интерфейс
и передает его объекту который рассылает событие.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте IT, Вы писали:
IT>Здравствуйте Anatolix, Вы писали:
IT>А как быть, если нужно рекурсивное использование классов, определённых в разных модулях? Т.е., например, в методе M1() класса A нужно работать с классамом B. А в классе B, в методе M2() нужно работать с классом A.
А никак. Ты даже uses там рекурсивный не имеешь право написать.
это тебе не заголовки в C++. Там к моменту компиляции одного
модуля нужно иметь скомпилированный tpu от другого модуля
(издержки соединения интерфейса и реализации в одном файле).
Понятно что при компиляции 2 файлов какой-то из них компилится
первым и в этот момент он не сможет поюзать второй.
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Здравствуйте Anatolix, Вы писали:
A>>>MFC — хорошо — 1 год
IT>>Если представить архитектуру Document/View в виде отношений один к одному/многим, как бы это выглядело? (не забудь и про CxxxFrame).
A>Sorry, но плохо помню такие вещи, уже семь лет не программировал с MFC
Ясно, не знал, да ещё забыл
Документ может представляться несколькими фреймами (несколькими MDI оконами) и несколькими view. Фрейм может включать несколько view.
Если нам не помогут, то мы тоже никого не пощадим.