Вопрос № 53081: Здравствуйте, уважаемые эксперты!
1. У меня такой вопрос: как на НТФС ставить СофтЛинки? В MSDN про это написано так, что можно было бы и ничего не писать. Ясно только, что это делается как ReparcePoint, а вот как его курить - я не понял. Может к...Вопрос № 53093: Здравствуйте уважаемые эксперты!
Сразу извиняюсь, если кинул вопрос не в ту ветку, но дело в том, что результат надеюсь получить как раз на языке С/С++, хотя можно и на другом (C, Pascal, Asm)...
Итак: а не найдётся ли у кого-нибудь...Вопрос № 53108: Уважаемые эксперты!!!
У меня вопросик:
Я нахожу процес, потом пытаюсь его закрыть, но что-то не работает(скорей всего не правильно использую функции), посмотрите ниже на исходник....Вопрос № 53142: Привет, эксперты. Вот я тут задумался, и у меня возник вопрос. Как реализовать многозадачность или многопоточность (не знаю что правильно)самому на си. Ну к примеру я хочу чтобы у меня играла музыка(простейшая, создаваемая спикером) и одновременно ри...
Вопрос № 53.081
Здравствуйте, уважаемые эксперты!
1. У меня такой вопрос: как на НТФС ставить СофтЛинки? В MSDN про это написано так, что можно было бы и ничего не писать. Ясно только, что это делается как ReparcePoint, а вот как его курить - я не понял. Может кто знает как и примерчик кинет?
2. СофтЛинк можно установить и для файла и для каталога. Ссылка может быть на любом стационарном диске, но не в каталоге с источником. Так?
3. Если ставить линк на каталог, есть ли защита от кольца?
Отправлен: 24.08.2006, 02:16
Вопрос задал: Evgenijm (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Www2
Здравствуйте, Evgenijm!
1. Насколько я знаю, софт-линки в NTFS - это обычные ярлыки, но их поддержка не реализована на уровне ядра. Хард-линки есть, можно попробовать воспользоваться стандартной функцией link.
2. Если софт-линк - это ярлык, то его можно записать где угодно :)
3. Защита от кольца будет, если не создавать ссылку на каталог внутри самого каталога или его подкаталогов.
Ответ отправил: Www2 (статус: 5-ый класс)
Ответ отправлен: 24.08.2006, 06:40 Оценка за ответ: 4
Вопрос № 53.093
Здравствуйте уважаемые эксперты!
Сразу извиняюсь, если кинул вопрос не в ту ветку, но дело в том, что результат надеюсь получить как раз на языке С/С++, хотя можно и на другом (C, Pascal, Asm)...
Итак: а не найдётся ли у кого-нибудь из экспертов работающего исходничка процедурки вычисления циклической контрольной суммы (CRC) протокола Modbus RTU модификации? Лучше даже если без обработки старт/стоп битов и без контроля паритета.
А то вот написал, а результат не сходится с примерами в разных документациях.
То ли я чего не понял, то ли теория не сходится с практикой...
P.S.: В приложении - мой код... Может быть с ходу увидит кто ошибку...
Приложение:
Отправлен: 24.08.2006, 09:50
Вопрос задал: Sergijj (статус: 4-ый класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: C4tnt
Здравствуйте, Sergijj!
Посмотрите здесь: http://www.dore.ru/perl/nntp.pl?f=1&gid=17&mid=56945&p=2
--------- Теперь к нашим ответам осталось лишь найти вопросы
Ответ отправил: C4tnt (статус: 2-ой класс)
Ответ отправлен: 24.08.2006, 13:31
Вопрос № 53.108
Уважаемые эксперты!!!
У меня вопросик:
Я нахожу процес, потом пытаюсь его закрыть, но что-то не работает(скорей всего не правильно использую функции), посмотрите ниже на исходник.
Отвечает: C4tnt
Здравствуйте, Корсак Александр Юрьевич!
Если я нигде не ошибся, ExitProcess уничтожает ваш собственный процесс.
Пользуйте TerminateProcess (GetExitCodeProcess вызывать не нужно. Ставьте uExitCode в ноль)
BOOL TerminateProcess(
HANDLE hProcess, //[in] хендл
UINT uExitCode //[in] код, который возвратит процесс после своей смерти
);
Если вам нужен код завершения - отправляйте процессу WM_CLOSE
Для этого нужно знать PrimaryThread процесса.
Как его узнать - особый вопрос.
Отправлять с помощью PostThreadMessage
Потом ждите его завершения примерно так:
lpExitCode = STILL_ACTIVE;
tryit = 0;
while (tryit < 100 && (lpExitCode == STILL_ACTIVE || lpExitCode == 0))
{
GetExitCodeProcess( hWin, &lpExitCode );
tryit++;
}
if (lpExitCode == STILL_ACTIVE)
{
TerminateProcess(hWin,0); //Total Commander должен умереть
}
if (lpExitCode == 0)
{
// обработка ошибки (код ошибки в GetLastError() )
}
Ещё лучше подождать завершения просесса с помощью WaitForSingleObject, а уже потом то, что здесь написано. !!Не ставьте timeout в бесконечный если не хотите завесить свою программу
вместе с висящим процессом.!!
--------- Теперь к нашим ответам осталось лишь найти вопросы
Ответ отправил: C4tnt (статус: 2-ой класс)
Ответ отправлен: 24.08.2006, 14:41
Отвечает: InviZ
Здравствуйте, Корсак Александр Юрьевич!
В добавление к предыдущему ответу. Если система - NT(2000XP), то скорее всего, вам понадобятся привилегии, для того, чтобы завершить процесс...
Примерный код в приложении
Приложение:
Ответ отправил: InviZ (статус: 2-ой класс)
Ответ отправлен: 25.08.2006, 10:13 Оценка за ответ: 4
Вопрос № 53.142
Привет, эксперты. Вот я тут задумался, и у меня возник вопрос. Как реализовать многозадачность или многопоточность (не знаю что правильно)самому на си. Ну к примеру я хочу чтобы у меня играла музыка(простейшая, создаваемая спикером) и одновременно рисовались какие-нибудь фигурки на экране или что нибудь в этом роде, в общем какая-нить графика. Так вот допустим у меня есть функция которая музыку играет PlayMySong(), вот я её вызываю, а далее идёт рисование графики, функция PaintMyShape(). Так всем известно, что
пока не отработает первая функция переход ко второй функции не возможен. Звучит странно. Никто не задумывается когда играет в игры что одновременно звучит музыка и сама графика работает- но на это берёт ответственность сама windows, точнее её ядро. А как самому реализовать такую штуку чтобы в консоли работало или под чистым досом. Что почитать посоветуете ?Спасибо.
Отвечает: Хватов Сергей
Здравствуйте, Александр Михайлович!
Есть два пути:
1. писать приложение так, чтобы оно было event-driven, то есть только реагировало на всевозможные события приходящие извне: от оконной системы, устройств (tнажата клавиша, или буфер звуковой карты освобождается) и т.д. Путь хлопотный, но все GUI программы работают именно так, и соответственные библиотеки такое программирование сильно упрощают.
2. использовать threads Это проще (хотя подводные камни тоже имеются), но требуется, чтобы это поддерживалось в системе.
В любом случае к языку программирования это имеет отношение не слишком большое.
Ответ отправил: Хватов Сергей (статус: 2-ой класс)
Ответ отправлен: 24.08.2006, 17:43
Отвечает: EPDSota
Здравствуйте, Александр Михайлович!
В большом угрублении все выглядит так:
Устанавливаешь обработчик перрываний по таймеру. Он делает:
1. Проверяет, не выполняеться ли при этом критических задач (типа записи на диск), если они идут - доделывает их.
2. Записывает состояние задачи в свою внутреннюю таблицу: регистры процессора, стек, видеоданные
3. Берет из этой таблицы данные к следующей задаче, восстанавливает их и выполняет возврат из прерывания в эту задачу (удаляя из внутренней из таблицы)...
и следующая задача выполняется, пока не установиться прерывание по таймеру, дальше смтри п.1
так и получаеться - таблица текущих задач, которые процессор время от времени запускает. В современных процессорах есть много функции для поддержки такого режима работы.
В играх прерывания и переключения задач идут не только от таймера, а и от нажатой клавиши или окончания звучания отрывка, тогда и запускается соответствующая задача...
--------- Открыть глаза навстречу солнцу
Ответ отправил: EPDSota (статус: Специалист)
Ответ отправлен: 24.08.2006, 17:47
Отвечает: Яруллин Азат Рифкатович
Здравствуйте, Александр Михайлович!
Вот консольное приложение (см. приложение).
Считайте что функция PlayMySong() соответствует ThreadFunc1(), а PaintMyShape соответствует ThreadFunc2();
Пример демонстрирует как эти 2 функции работают параллельно.
Думаю, разберетесь.
P.S. Возможно, приведенный код написан не корректно... (но он работает). я писал его только чтобы показать работу потоков...
Удачи!
Приложение:
Ответ отправил: Яруллин Азат Рифкатович (статус: 8-ой класс)
Ответ отправлен: 24.08.2006, 19:06
Отвечает: Ромка
Здравствуйте, Александр Михайлович!
Загружаешь музыку и графику в память, затем с помощью таймера в каждый момент времени сначала играешь очередной кусок звука и выводишь очередной кадр графики, используя данные в памяти.
--------- #include
Ответ отправил: Ромка (статус: 1-ый класс)
Ответ отправлен: 24.08.2006, 19:51
Отвечает: Шинтяков Дмитрий Васильевич / Ratson
Здравствуйте, Александр Михайлович!
Пара терминов:
Многозадачность - когда могут одновременно выполняться несколько (совершенно различных) программ.
Многопоточность - когда в одной программе имеется несколько потоков выполнения (разделяющих общую память, переменные, код).
Поддержка того и другого зависит от ОС. ДОС не поддерживает ни того, ни другого.
Кроме того, КОНСОЛЬ и ДОС это разные вещи! Консольное приложение - просто приложение, которое использует консольный ввод-вывод. Оно может пользоваться всеми возможностями опреационной системы, в том числе и создавать потоки, обращаться к функциям WinAPI и т.д.
Реализовать можно, как уже говорили, двумя способами: неинтересным и при помощи потоков. Создаются потоки в виндах при помощи CreateThread
В важем случае будет два потока - в одном исполняется главный цикл игры, а в другом играет музыка.
При создании многопоточных приложений возникают так называемые проблемы синхронизации, что это такое - лучше посмотреть в литературе, так как тема обширная.
Как правильно отметили, работа с потоками зависит не столько от языка, сколько от операционной системы. (Отличается разве что Java, там многопоточность может быть реализована собственными средствами)
Отвечает: Sergijj
Здравствуйте, Александр Михайлович!
Ещё добавлю к простыне ответов (ибо уж слишком пного налегают на ОС, а точнее на Windows и систематизирую немного).
Все процессоры, начиная с i80x386 (и некоторые 286) поддерживают многозадачность (расшифровку терминов см. у "Шинтяков Дмитрий Васильевич / Ratson"), а более поздние и многопоточность, на аппаратном уровне (protected mode процессора), поэтому использовать её можно и без всякой операционной системы вообще (но это уже в другую ветку RusFaq.ru). А ОС... - она только в силу своего интеллекта использует аппаратные возможности процессора.
Но мысли приведены верные, существуют такие основные подходы:
1. Через event-handler. Это когда у тебя процедура вызывается по событию.
2. Line-handler. Это когда у тебя работают всегда все процедуры (вызываются в handler'е по очереди), но не содержат длительных циклов и нигде не замирают, то есть работают по принципу "сделал - изменил семафор - отвалил".
3. Через другой процесс (может быть и дочерним, а может быть и вообще "левым"). Тогда процессы общаются только с помощью внешних разделяемых ресурсов.
4. Через потоки. Это когда несколько подзадач вертятся каждая в своём потоке. Общаются через общие ресурсы (могут и через внешние, только зачем?).
5. Полу-железно. Когда одну из задач выполняет какое-нибудь железо.
... Вроде всё, может ещё чего забыл...
Но, в любом случае - успехов в освоении PC!
--------- Стучитесь! И Вас откопают...
Ответ отправил: Sergijj (статус: 4-ый класс)
Ответ отправлен: 25.08.2006, 10:00