Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Программа потребляет много cpu

#c_sharp


Небольшое отступление    

У нас в фирме используется одна очень древняя программа с одним недостатком. После
работы с ней надо чистить за ней файлы и в одном файле менять значения на первоначальные.
Иначе при следующем запуске программа работает некорректно.

Итак решение - пишем программу в виде виндоуз формы, а потом форму удаляем, и кидаем
ее в автозагрузку. В программе запущен таймер который проверяет если та древняя программа
была закрыта пользователем он файлы приводит в первоначальный вид.

Но так форму я удалил (пользователям о ней знать не обязательно), что бы моя программа
не завершала работу в ней стоит бесконечный цикл. Вот код:

private static void Main()
    {
TimerCallback timer= new TimerCallback(Run);

        System.Threading.Timer time = new System.Threading.Timer(timer, null, 0,
2000);    
for(;;)
}
static void Run(object state)
{....}


но как оказалось он потребляет 20-30 процентов ресурсов проца именно из за бесконечного
цикла. Есть у кого нибудь идеи как уменьшить нагрузку на проц?

Да и не хотелось бы использовать форму пусть и полностью прозрачную.
    


Ответы

Ответ 1



Это у вас 3-4 ядра, вот оно и потребляет всего 20-30 процентов. Будет одно ядро - будет жрать 100, я думаю. Поставьте в этот цикл хотя бы Sleep(100) и будет счастье. А вообще надо нормально переписывать, а не костыли использовать...

Ответ 2



Программа, которая "гоняет" вечный цикл - считается зависшей. Это - не самое лучшее решение. Вот так будет чуть лучше: Application.Run(); Метод Run без параметров запускает цикл обработки сообщений (что приведет к "засыпанию" главного потока) - но при этом не задает главную форму (позволяя программе работать без открытых форм). При этом программа не теряет возможности корректно обработать сообщение закрытия (например, при завершении сеанса пользователя).

Ответ 3



Одно из возможных решений для запуска старых DOS-программ (и не только их) и выполнения каких-то дополнительных действий — через скрипты, запуск которых с точки зрения пользователя будет выглядеть так же, как и запуск самой программы, только скрипт может выполнить еще и какие-то сопутствующий действия. Например, у автора вопроса нужно после выполнения программы удалять ряд файлов и менять значения параметров в одном из файлов. Попробуем решить задачу при помощи скриптов. Когда-то давно у меня был IBM PC 286 c EGA-монитором, 40Мб жестким 5-ти дюймовым диском (именно так, и еще 5" дисковод для НГМД), на котором работал MS-DOS 6.22 и Norton Commander 4.0. С тех пор еще немного помню как работать с BAT-файлами, которые, впрочем, весьма часто и успешно используются и по сей день: rem Отключаем вывод на экран: @echo off rem Очищаем экран: cls rem Переходим в папку с программой: cd "C:\OLD_PRG\" rem Здесь можно выполнить запуск необходимых программ ДО запуска rem основной программы, например, загрузить русификатор. rem Если запустить его через команду start, то он запустится в отдельном окне. rem Пример: start keyrus.com rem Но нам русификация нужна в этой сессии, потому запускаем его так: keyrus.com rem Теперь запускаем нужную программу и ждем ее завершения: start /wait OldPrg.exe rem Программа завершилась, теперь можно удалить нужные файлы. rem В данном примере это временные файлы *.tmp del *.tmp rem Восстановим файл настроек, для этого просто удалим измененный файл в rem папке программы, а потом заменим эталонным из резервной копии, в rem качестве которой у нас выступает подпапка BAK, находящаяся тут: rem "C:\OLD_PRG\BAK", просто использую относительные пути: del config.cfg copy .\BAK\config.cfg config.cfg rem Всё, теперь можно подождать нажатия любой кнопки, а затем выйти из сессии pause exit Скрипт очень простой, приведен в качестве примера. На самом деле, можно многое что делать при помощи пакетных файлов. Единственный минус - если создать ярлык к файлу напрямую, то при его запуске будет видно окно консоли, в котором запущен наш BAT-файл. Это тоже решабельно, ибо есть утилиты, которые могут выполнять BAT-файл скрывая окно консоли, в котором он выполняется. Так же можно выполнять скрипты на PowerShell, но поскольку по-умолчанию есть ограничение в политике Windows на выполнение таких скриптов, то рассматривать этот вариант я не буду. Если всё же очень интересно, то лучше это оформить как отдельный вопрос. Можно так же вызывать скрипты на других языках, например, JavaScript, или Visual Basic Script. И, как вариант, можно написать свою простенькую обертку вокруг чужого EXE, который можно запускать через Process.Start используя WaitForExit. В частности, сам так делаю для работы с старым консольным архиватором ARJ. Еще вариант для старых DOS-программ, это, разуммется, DosBox. Вот, в зависимости от ситуации, можно использовать разные подходы для решения обозначенного вопроса по запуску старых программ в современном окружении.

Ответ 4



Ну можно написать сервис(службу Windows)класс ServiceBase в.net. Выложите код где вы чистите файл. Из кода не понятно что у вас происходит, таймер вообще не используется.

Комментариев нет:

Отправить комментарий