47 / 36 / 0
Регистрация: 21.05.2010
Сообщений: 301
|
|
1 | |
Как в C++ управлять пк23.11.2010, 15:17. Показов 9456. Ответов 16
Метки нет (Все метки)
Здраствуйте, я начал изучать С++, уже кучи материалов перерил, но немогу понять как физически упровлять пк, например отслеживать температуру цп или изменять скорость куллеров, и прочее. Скиньте пожалуйсто статьи на эту тему или скажите какие небудь книги на эту тему.
0
|
23.11.2010, 15:17 | |
Ответы с готовыми решениями:
16
Как пользоваться событиями или как управлять формой из потока? Как создать список номеров которыми можно управлять как базой данных Как управлять камерой в 3д? Управлять как одным |
47 / 36 / 0
Регистрация: 21.05.2010
Сообщений: 301
|
|
23.11.2010, 15:33 [ТС] | 3 |
Родной труднее чем с++ XD
1
|
23.11.2010, 18:42 | 4 |
Работать с аппараутрой можно только через операционную систему. Операционная система тебе предоставляет некоторый интерфейс взаимодействия (API), при помощи которого прикладная программа может системе что-то "сказать" или что-то "спросить". К языку программирования это не имеет никакого отношения
1
|
23.11.2010, 21:00 | 6 |
Сообщение было отмечено как решение
Решение
Информация хранится в аппаратуре. Там есть термометр, с которого можно снять показания. Есть драйвер под материнскую плату, при помощи которого операционная система "общается" с аппаратурой. Драйвер - это такой же интерфейс между ОС и машиной, каким является API (интерфейс между приложением и ОС).
На пальцах это дело выглядит примерно так. Любое устройство подключается через так называемые порты ввода-вывода, которые при помощи материнской платы отображаются на некие адреса памяти. Т.е. в машине может стоять 1 гиг памяти, но адреса, к примеру, из диапазона 3.7-4 гига (при условии 32-битного режима) используются для портов ввода-вывода (независимо от количества памяти в машине). Эти адреса материнская плата транслирует не на модули памяти, а на шину, через которую втыкаются устройства. Операционная система выполняет "обычное" (или почти обычное, детально не могу сказать) чтение или запись в память по адресу, отображённому на устройство. Это обращение пойдёт в устройство. Например (чисто теоретически), видеокарта может работать таким образом, что если по адресу 0x11223344 записать единичку, то по адресу 0x11223345 будет сформировано значение температуры графического процессора, а если записать двойку, то будет сформировано скорость вращения кулера и т.п. К каждому устройству прилагается драйвер, который в одной стороны "знает", как общаться с устройством, с другой стороны знает, по каким правилам надо общаться с ОС (потому в каждой ОС свои принципы работы с драйверами) Ну из сказанного можно понять, почему при наличии 4 гигов оперативы, реально видно только 3.5 или 3.2 или 3 (в зависимости от материнской платы). Точно так же можно понять, почему драйвер видеокарты под винду не будет работать под линуксом (хотя казалось бы, машина одна и та же и коды исполняются те же самые). Точно так же программа, работающая с устройством под виндой непосредственно через драйвер (т.е. на низком уровне) не будет работать под линуксом, даже если перекомпилять исходники. именно поэтому пишут интерфейсы ещё более высокого уровня. Например, Open GL. Это набор библиотек, который с одного конца имеет несколько реализаций под различные ОС, с другой стороны имеет интерфейс прикладного уровня, НЕ зависящий от операционной системы. Так или иначе, между пользовательской программой и аппаратурой всегда имеется цепочка из нескольких интерфейсов начиная драйвером и заканчивая прикладной библиотекой. И всё, что находится между программой и машиной, построено по принципу конструктора: из различных кубиков выстраивается нужная цепочка. Но на практике не все кубики имеются в наличии, хотя теортеически их всегда можно создать (было бы кому этим заняться)
11
|
23.11.2010, 21:57 | 8 |
Я не специалист в этой области, но напрямую писать в порт ввода-вывода из пользовательского приложения скорее всего нельзя (была бы такая возможность - машину можно было бы убить одним неосторожным движением). Для этого и существует драйвер. Общение с драйвером идёт на уровне типа "запиши в порт такой-то значение такое-то", но при этом это всё накрыто интерфейсом, отрезанным от абсолютных значений адресов. При этом каждое такое обращение драйвер проверяет на корректность и забраковывает недопустимые
2
|
47 / 36 / 0
Регистрация: 21.05.2010
Сообщений: 301
|
|
23.11.2010, 22:13 [ТС] | 9 |
Неужели все программы, например speedfan, проходят столько сложных операций при работе?
1
|
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
|
|
23.11.2010, 22:31 | 11 |
Все намного проще.
Видел код на бейсике котрый вот так определял текущую температуру процессора и чипсета Код
#ADR_REG = $295 ;Это адреса регистров системной платы, с помощью которых можно узнать температуру #DATA_REG = $29 Procedure Termo(z) ; Эта процедура работает в параллельном потоке Shared *Inp32_address, *Out32_address Repeat ; Начало "безконечного" цикла Repeat ForEver CallFunctionFast(*Out32_address, #ADR_REG, $2B) ; Получает текущую температуру процессора x=CallFunctionFast(*Inp32_address, #DATA_REG) SetGadgetItemText(0,0,StrU(x, #PB_Byte)+" °C",1) ; отображаем её в таблице CallFunctionFast(*Out32_address, #ADR_REG, $29) ; Получает текущую температуру системной платы x=CallFunctionFast(*Inp32_address, #DATA_REG) SetGadgetItemText(0,1,StrU(x, #PB_Byte)+" °C",1) ; отображаем её в таблице SetGadgetText(3, Str(CpuUsage())+" %" ) ; Получаем и отображаем текущую загрузку процессора Delay(1000) ; Пауза, равная 1 секунде. ForEver EndProcedure
1
|
47 / 36 / 0
Регистрация: 21.05.2010
Сообщений: 301
|
|
23.11.2010, 23:18 [ТС] | 13 |
Разве винда отвечает за температуру и распряделение электричества на кулеры?
1
|
23.11.2010, 23:32 | 14 |
Разница в том, что для прикладной программы не надо писать сотни строк кода для работы с устройством. Интерфейс, который тебе выдаёт операционная система, позволяет практически одинаково работать с любым устройством. Т.е. посмотреть температуру процессора, открыть привод DVD-дисковода или задать настройки для сетевой карты - это практически одно и то же действие: вызов функции API с некоторым набором параметров. Тебе не надо заботиться о том, в какой слот на плате воткнуто устройство, это устройство IDE, PCI или AGP и т.п. - это всё забота ОС.
За это отвечает устройство (железо). ОС лишь может сделать какие-то настройки, предусмотренные разработчиками устройства (если таковые вообще имеются). На старых процессорах кулер - это всего лишь вентилятор с двумя состояниями: "пропеллер включен" и "пропеллер выключен", причём текущее состояние зависит только от того, включен комп или нет. Устройство не подразумевало, что им можно управлять со стороны ОС, а потому это простая железяка, про которую материнская плата даже не знает. Максимум, что она знает - это то, что в слот воткнута какая-то хрень, потребляющая электричество согласно такому-то стандарту, а что это за хрень - материнская плата не знает
1
|
47 / 36 / 0
Регистрация: 21.05.2010
Сообщений: 301
|
|
23.11.2010, 23:55 [ТС] | 15 |
А где можно найти информацию о том как через программу управлять всем этим (кулерром дисководом и прочем), просто я привык что железо отдельно программа отдельно, и я тормажу во всем этом сильно
1
|
23.11.2010, 23:59 | 16 |
В посте #2 уже всё об этом сказано
Добавлено через 3 минуты Под линуксом универсальный системный вызов для работы с устройствами называется ioctl В случае винды это, судя по всему, DeviceIoControl. Вот про это и ищи
1
|
47 / 36 / 0
Регистрация: 21.05.2010
Сообщений: 301
|
|
24.11.2010, 01:14 [ТС] | 17 |
Вот есть кое что http://netcode.ru/cpp/?artID=3236
0
|
24.11.2010, 01:14 | |
24.11.2010, 01:14 | |
Помогаю со студенческими работами здесь
17
Как управлять checkbox? Как управлять мышей с С++? Как управлять температурой? Как управлять разрешениями? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |