![]() |
|
|
![]()
|
|
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Нет, так мы далеко зайдем
Насколько вероятна ситуация, когда несколько потоков синхронно обратятся к одному? Даже если это возможно, то достаточно добавить в класс потока еще критическую секцию и прикрыть ею весь код SendTreadMessage. Тогда двух событий на поток достаточно. И будет у нас по принципу: кто первый, того и тапки. А остальные подождут. Сам подумай: даже если SendThreadMessage вызывается разными потоками, в результате-то будет работать только один (к которому обратились)! Т.е. в один момент может обрабатываться только чей-нибудь один запрос. Про чужое событие никто не узнает Даже если у тебя потоки хаотично друг к другу обращаются (синхронно!), и никто не хочет ждать, все равно придется как-то их в очередь строить... приоритеты назначать ... и понеслось ... в результате получаем новый Windows Kernel ... старый нафик выбрасываем (наш, конечно, лучше В общем, не увлекайся. В этом деле (в программировании) один из самых главных принципов - научится вовремя бить себя по рукам, и помнить, что лучшее - враг хорошего. -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Очень даже. У меня программа будет работать с несколькими прибораи одновременно по разным интерфейсам (ком-порты, Ethernet, и в перспективе еще и USB), на каждый планируется создать свой поток.
Earnest, ты профи! Добавлено @ 18:52 А ведь точно, это мысль.. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
| Dreamer_0x01 |
|
||||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Ну что, уже достаточно давно пользуюсь своей консрукцией, пока работает.
может, тут есть какие-то подводные камни? Щас-то приложение маленькое, но вот на днях буду его очень сильно расширять. Вот код: собственно, класс
Описание класса
Использование
Вот у меня вопрос - правильно ли я сделал ReplyMessage(), или тут есть какие-то "подковырки"? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Вроде нормально... раз пока работает...
Но если собираешься сильно расширять, то используй вместо CRITICAL_SECTION CCriticalSection, а вместо Enter/Leave - CSingleLock. Во-первых много строчек кода уйдет, что само по себе неплохо. Во-вторых, смесь CEvent и "просто" CRITICAL_SECTION выглядит, как бы это помягче сказать В-третьих - код будет безопаснее по отношению к исключениям - это тебе обеспечит идиома "захват ресурса есть инициализация". В-четвертых, вызовы ...ResetEvent в конструкторе совершенно излишни, т.к. CEvent по умолчанию создается не в сигнальном состоянии. И зачем все эти this-> ? -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
НУ в двух потоках работает все прекрасно. Единственное, почему-то были глюки при выхове функций из...того же самого потока. Правда, с этим я постепенно и сам разберусь, может быть, неправильно что-то вызываю. Вот скоро буду проверять на четырех, там и поглядим.
Ага. Сделаю. Видишь ли, я самоучка, и до чего первого дошел, то и прижилось во всех программах Кстати, где бы почитать что-то вразумительное про эти самые исключения, русскоязычное? До сих пор толком не понимаю, что это такое и зачем нужно. А так бысрее код набирать текст программы - набираешь this->, и студия тебе выдает списочек всех членов класса, удобно, нажал одну-две клавиши вместо десятка - и элемент вписан. Только лишь ради этого ;) Компилятор же я так понял все равно все лишнее выкинет? Это сообщение отредактировал(а) Dreamer_0x01 - 6.2.2006, 20:09 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Скорее вставит, если этого this-> нет. Формально все правильно, но ИМХО, код более громоздкий и поэтому хуже читаемый. Я предпочитаю классовые переменные с префиксом "m_" делать, чтобы сразу видно было ху из ху. А скорость набора на скорость конечную написания кода не влияет. Кстати, у тебя есть Visual Assist? Если нет, найди и поставь, очень рекомендую (и в смысле автодополнения тоже).
Исключениям посвящена изрядная часть книги Саттера "Решение сложных задач на С++", здесь на форуме в разделе C++ обсуждалась, может и ссылки на электронную версию есть. И его же продолжение "Новые сложные задачи на С++". А еще, по-моему Мейерс на эту тему писал: "50 советов по эффективному использованию С++", "Еще 35 советов" про то же самое, а также "Эффективное использование STL". Названия приблизительные. Я бы советовала начать с Мейерса, мне кажется у него более доступно. Все книжки небольшие, и все из серии must read. -------------------- ... |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
А вот это недавече как сегодня где-то видел, но смутило кричащее название, и пропустил. Завтра в поиске восстановлю сайтик, где это было выложено. Нет, не стоит. А что эта штука кроме подсветки кода делает? Добавлено @ 00:10 я понимаю, но когда я сам же забываю, как точно называется имя переменной - то приходится делать именно так. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ну это переводчики постарались, оригинальное название "Exceptional C++". Там просто стиль изложения такой: ставится задача, потом решается. VisualAssist у меня так давно, что я уже не помню, что он делает, а что сам MSVC. По-моему, я автодополнение MSVC и его же броузинг кода просто не использую, а использую VisualAssist (потому что лучше). Еще он вроде автоматически исправляет мелкие ошибки набора, показывает контекст текущего выражения и его определение. Плюс настраиваемые функции: генерация блоков текста по шаблонам. Очень удобно, например, в новые файлы стандартные шапки вставлять. -------------------- ... |
|||
|
||||
![]()
|
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |