у меня пару вопросик про СОМ порты. 1. Сколько в хр может быть максимум СОМ портов ?? 2.Как лучше сделать когда к компу подключено 100 модемов, и в каждый нужно писать/читать, у меня два варианта 1. Сделать на каждый порт по потоку. 2. Или подключить все порты и в одном потоке для все поставить поставить эвенты на приход данных + эвент что нужно что-то записать и все это ждать на WaitForMultitpleObjects() .
XshStasX 100 модемов к 1 компу. Извиняюсь за иронию, но - дайте фотку. Ответ на первый вопрос: 256 портов. Второй вопрос - логичнее было бы выделять потоки. Но можно использовать и волокна (опять же, смотря чего вы добиться хотели), тогда нужно свой диспетчер создать, но это не очень трудно.
100 потоков это много. Так что второй вариант. но в реалиях врятли больше 10 так что можно 1 использовать.
TermoSINteZ Могу ошибаться, т.к. не работал с com-портами, но разве не проще и одновременно логичнее использовать порты завершения? Они должны вполне эффективно распределить нагрузку на несколько потоков.
Ничего особенного там ящик в одном ящике 30 тел. подключенные через usb(хаб или концентратор точно не знаю название это устройства, типа удлинитель юсби))) к нему через юсби провода подключены телефоны. Сейчас 30 модемов работает так так все норм. А тут думают еще подключить то есть в итоге окола ста скоро их станет. Вот и получается что в программе будет всего 100 потоков. Их можно свести к одному если сделать по 2 второму варианту. Но есть такая штука как очередь сообщений(это когда ставиться асх. операция в очередь и когда она завершиться о ней сигнализирует эвент), то есть если кинуть 10 запросов на запись и 10 на чтение на каждый модем то получим как бы 2000 ожидающих завершения операций, эти все сообщений сохраняются где то в потоке ? И что будет к примеру если уже нет памяти для сообщений?
l_inc Я просто привел пример того как можно создать обработку очереди. А сами ком порты не связаны, с этим. Но имхо потоки выгоднее делать - потому, что каждый поток будет обслуживать один модем. Четкое разделение, четкие правила. И я сомневаюсь что будет огромная нагрузка - модемы - медленные по своей природе - там не будет как на игровых\sql серверах, где такая тактика бы не подошла в принципе. И 100 потоков винда в состоянии обслужить. А писать свой планировщик и с портами завершения возиться для вашей задачи... Не вижу пока _существенных_ аргументов в пользу. Памяти какой? Если ситуация с потоком - то для каждого потока вы же выделяете память. Например страницу 4кб, вот если ваш буфер приема допустим 200 байт (сообщение), когда дойдет до предела накопления (+ условие времени, например 5 минут) вы скидываете информацию на диск (если она нужна).
XshStasX По поводу 256 портов IMHO TermoSINteZ ошибается обычные COM порты интегрированные на материнской плате или ISA I/O используют раздельные прерывания (IRQ3 или IRQ4) и фиксированные адреса ввода-вывода COM1/COM3 (Диапазон ввода/вывода 03F8h-03FFh IRQ4) COM2/COM4 (Диапазон ввода/вывода 02F8h-02FFh IRQ3) то есть на каждый COM-порт 8 портов ввода/вывода с фиксированными адресами в случае с PCI, прерывания становятся разделяемыми (т.е. все COM порты используют одно прерывание IRQ5 и адреса уже состоят из 4-х цифр (CC00, CC08, CC10, CC18)
А если идет подключение устройства через юсби, и там дальше драйвер симулирует СОМ порт. то так их 256 или не ограничено ??
XshStasX Не знаю -- но пространство портов (адреса ввода/вывода) разделено на 64К 8-разрядных портов, 32К 16-разрядных портов, 16К 32-разрядных портов или другую комбинацию устройств, которые в сумме не превышает 64 Кбайт. Из них половина зарезервирована для внутреннего использования фирмой Intel, сопроцессором, стандартными устройствами и т.д. так что в любом случае количество COM-портов ограничено, кроме того каждый COM-порт использует 8 портов (данные, управления, состояния и т.д.)