Q: Где описание системного API? A: * http://ecomstation.ru/projects/developer/?action=os2api -> OS2 API * eCS CD2 -> IBM OS/2 Toolkit45 -> \BOOK\* ** Dos* -- view cp1.inf+cp2.inf+cp3.inf ** Win* -- view pm1.inf+pm2.inf+pm3.inf+pm4.inf+pm5.inf ** MMOS2* -- view mmref1.inf+mmref2.inf+mmref3.inf ** Gpi* -- view gpi1.inf+gpi2.inf+gpi3.inf+gpi4.inf === Семафоры === [Q]: Пpосвятите чайника на пpедмет OS/2-семафоpов [A]: Dima Kakurin (2:5020/468.14) В OS/2 имеется 3 вида семафоpов: 1. Mutual Exclusion (Mutex) semaphores. Использyются для yпоpядочивания достyпа к pазделяемым pесypсам. Т.е. может быть в состоянии свободен/занят, и имеет методы для захвата/освобождения. 2. Event semaphores. Использyется задачей для инфоpмиpования дpyгих задач о том, что пpоизошло некое событие. Т.е. основной областью пpименения является синхpонизация паpаллельно pаботyющих задач (пpоцессов) совместно выполняющих некие действия. Имеет методы Пpоизошло_Событие, Ждать_События,Сбpосить_Событие. 3. Multiple Wait (Muxwait) semaphores. Позволяет задаче ожидать многих семафоpов (типа 1 или 2) одновpеменно, а не опpашивать их по очеpеди. Ожидание заканчивается пpи освобождении любого из Mutex семафоpов, или пpи возникновении события для любого Event семафоpа. Примечание: В одном MuxWait семафоре нельзя смешивать event и mutex семафоры. В MuxWait семафор нельзя включать другой MuxWait семафор. P.S. Фyнкции для pаботы со всеми 3 типами семафоpов описаны, напpимеp, в Control Program Reference === API: DosEnterCritSection === prokushev: бимеры не советуют использовать вызовы API внутри этого дела - возможен deadlock. Что мы похоже и имели тут. в том числе - сишный рантайм - тоже не советуют prokushev: да воще это кривое решение - юзай мютексы. Не забывай, что вход в критическую секцию останавливает _все _ другие нитки в процессе. Даже те, которым нахрен не нужны твои данные. особенно круто это в случае с WPS :) prokushev: и это в _разы_ медленнее мютексов === API === * http://www.os2world.com/os2api/ === Таймеры === * метод 1: задал таймеру щелкать по семафору раз в секунду, дал ему TimeCritical и он отстает от времени компьютера. Ощутимо. Сейчас я добился 5 секунд за 5 минут. Нельзя-ли улучшить показатель? Комп нагружен на 3% Digi: если системный таймер, тот который дёргает евент-семафоры, то он совсем не обязан точные интервалы выдерживать * метод 2 привязывайся к счётчику миллисекунд, который отдаётся по DosQuerySysInfo DosQuerySysInfo( QSV_MS_COUNT, QSV_MS_COUNT, &ulКуда_записать_текущее_значение, sizeof(ULONG) ); * метод 3 [joseph]: а еще есть ACPI таймер\ [joseph] Power Managment timer, 3.6 times per microsecond пример есть в тулките ACPI * доп.инфо: http://wiki.laser.ru/os8/index.php/DosStartTimer http://wiki.laser.ru/os8/index.php/DosStopTimer http://wiki.laser.ru/os8/index.php/DosAsyncTimer http://wiki.laser.ru/os8/index.php/DosSleep http://wiki.laser.ru/os8/index.php/DosAllocSharedMem http://wiki.laser.ru/os8/index.php/DosGetNamedSharedMem http://wiki.laser.ru/os8/index.php/DosAllocMem http://wiki.laser.ru/os8/index.php/DosFreeMem