Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 509
от 30.08.2006, 01:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 370, Экспертов: 56
В номере:Вопросов: 4, Ответов: 10


Вопрос № 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
Уважаемые эксперты!!!
У меня вопросик:
Я нахожу процес, потом пытаюсь его закрыть, но что-то не работает(скорей всего не правильно использую функции), посмотрите ниже на исходник.

Приложение:

Отправлен: 24.08.2006, 12:11
Вопрос задал: Корсак Александр Юрьевич (статус: 1-ый класс)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: 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, точнее её ядро. А как самому реализовать такую штуку чтобы в консоли работало или под чистым досом. Что почитать посоветуете ?Спасибо.
Отправлен: 24.08.2006, 17:14
Вопрос задал: Александр Михайлович (статус: Посетитель)
Всего ответов: 6
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Хватов Сергей
Здравствуйте, Александр Михайлович!

Есть два пути:

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, там многопоточность может быть реализована собственными средствами)
Ответ отправил: Шинтяков Дмитрий Васильевич / Ratson (статус: 2-ой класс)
Ответ отправлен: 24.08.2006, 20:38

Отвечает: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.35 от 27.07.2006
Яндекс Rambler's Top100

В избранное