Как уменьшить использование ЦП

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Как уменьшить использование ЦП

Сообщение Kiryusha » 24.10.2005 (Пн) 11:41

Кто знает напишите, как сделать выбор приоритета.
У меня есть программа работающая с таблицами Excel так она помимо того, что работает порядка 20-30 минут еще и грузит 100% ЦП, так что приходится все эти 30 минут сидеть и тупо пялиться в монитор, ибо ничего другого уже не остается.

Кто знает, как это исправить подкиньте примерчик или ссылку.

Заранее сэнькс.
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 24.10.2005 (Пн) 11:43

наверное стоит еще раз проверить алгоритм проги :?:

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 24.10.2005 (Пн) 11:47

Что именно?
Прогу закидывать не буду, объясню принцип,

Там 2 вложенных цикла, которые и работают всё время.

Вобщем берется 1 число (минимум, который еще и помимо того ищется), и уменьшаем его, раскидывая его часть по максимумам, и так до тех пор, пока минимум, не станет меньше определенного числа, затем то же самое проделываем с максимумами. Всё очень муторно, но мне главное не время (!), а качаество, ибо графики не должны сильно разниться.

(Прога-то нелегальная)
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

575-61
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2005 (Пт) 8:09
Откуда: г.Ростов-на-Дону

Сообщение 575-61 » 24.10.2005 (Пн) 11:55

Какой библиотекой или какам методом пользуешся, для использования EXсEL?
Если надо решить задачу, то VB и без EXсELа все может.
Нужна точная помощь, нужен код.
Всё относительно и всё есть - логический хаос.

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 24.10.2005 (Пн) 11:59

делаю:
Код: Выделить всё
Dim objExcelDoc as object

set objExcelDoc=CreateObject("Excel.Application")


VB без EXCEL не подойдёт, я конечно думал, чтобы занести все данные из этой таблицы в ListView проработать его, а потом вернуть все данные в таблицу, но это не пройдёт, так как мне нужно где-то еще и все формулы хранить.

А насчёт уменьшения поглощения ЦП примерчик был бы не лишним.
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 24.10.2005 (Пн) 12:13

ты экстремум функции что-ли считаешь, так вот для этого есть ряд математических приемов для ускорения данной операции. открой справочник по высшей математике и посмотри.

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 24.10.2005 (Пн) 12:21

ты экстремум функции что-ли считаешь

Нет.

Объясняю.
У фирмы, на которой я работаю есть главный босс - в Москве. Ну так вот у нас за месяц натекает до 600 000 фин. потерь. Если они увидят такие цифры, то нас всех нах.. распустят. Есть спец. люди, которым дают нашу таблицу, деньги (ок. 15 тыс. руб.) и те меняют факт, так, что он становится ближе к плану, следовательно уменьшаются потери, при этом график начальных значений факта и конечных не должны сильно отличаться, вот для этого и нужна моя прога. Причём есть еще определенные контрольные часы, где разница должна быть СОВСЕМ по минимуму.

Ну так вот, моя прога отсылает им вместо 600 000 всего 10-15 тыс. и предраться им практически не к чему.
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

575-61
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2005 (Пт) 8:09
Откуда: г.Ростов-на-Дону

Сообщение 575-61 » 24.10.2005 (Пн) 12:23

1.Excel у Вас загружается даже не под управлением VB, а вашей программы - это не только замедляет процесс, но и происходит бесконечный пересчет в Excel (фоновый режим) - отключите функцию Recalc, а когда надо включите.
2.Если Вам необходимы вычисления, http://bbs.vbstreets.ru/viewtopic.php?t=20291
Всё относительно и всё есть - логический хаос.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 24.10.2005 (Пн) 12:25

Добавь DoEvents во внутренний цикл. Быстрее работать точно не будет, зато проц разгрузится :wink:
Лучший способ понять что-то самому — объяснить это другому.

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 24.10.2005 (Пн) 12:28

Нет, Recalc я отключаю и до конца про нее совсем забываю.

Я считываю из таблицы 3 числа делаю с ними всё что надо и кидаю их вновь в таблицу.

И к тому-же мне не важно время выполнения. Пусть она хоть весь день считает, мне нужно, чтобы параллельно с этой программой я мог хоть что-нибудь еще делать, а так это невозможно.
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

575-61
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2005 (Пт) 8:09
Откуда: г.Ростов-на-Дону

Сообщение 575-61 » 24.10.2005 (Пн) 12:32

Создай *.Pif файл и отметь приоритет.
Всё относительно и всё есть - логический хаос.

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 24.10.2005 (Пн) 12:32

Antonariy

А поподробнее о DoEvents...

Вот мой код:

Код: Выделить всё
    While FindMin(Rw, lngColumnOtklon, MR, 743) < -1 * Gran
        tmpChanges = Thousends(prcnt * .cells(MR, lngColumnOtklon))
        .cells(MR, Clmn).Value = .cells(MR, Clmn).Value - tmpChanges
        While tmpChanges <> 0
            If FindMax(Rw, lngColumnOtklon, MaxR, 743) > Gran Then
                tmpCh = Thousends(prcnt * FindMax(Rw, lngColumnOtklon, MaxR, 743))
                If tmpChanges + tmpCh <= 0 Then
                    .cells(MaxR, Clmn).Value = .cells(MaxR, Clmn).Value - tmpCh
                    tmpChanges = tmpChanges + tmpCh
                Else
                    .cells(MaxR, Clmn).Value = .cells(MaxR, Clmn).Value + tmpChanges
                    tmpChanges = 0
                End If
            Else
                Rw = Rw + 24
                If Val(.cells(Rw, Clmn).Value) = 0 Then
                    .cells(MR, Clmn).Value = .cells(MR, Clmn).Value + tmpChanges
                    GoTo 1
                End If
            End If           
        Wend
    Wend



Кстати, по-моему это еще старый код... Ну да ладно не хочу сейчас последнюю версию искать. Может какие исправления напишешь.
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 24.10.2005 (Пн) 12:33

DoEvents в цикл добавляй, как тебе уже посоветовали

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 24.10.2005 (Пн) 12:33

575-61
А что за pif файл?

Примерчик брось.
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

575-61
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2005 (Пт) 8:09
Откуда: г.Ростов-на-Дону

Сообщение 575-61 » 24.10.2005 (Пн) 12:50

1.В файловом менеджере щелкни правой кнопкой мышки.
2.Выбери СВОЙСТВА
3.Зайди на вкладку Программа
4.Напиши имя своей программы, и т.п.
5.Зайди на вкладку РАЗНОЕ
6.Поставь ползунок в нужное (приоритетное) положение.
Удачи!
Всё относительно и всё есть - логический хаос.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 24.10.2005 (Пн) 12:55

While tmpChanges <> 0
DoEvents
If FindMax(Rw, lngColumnOtklon, MaxR, 743) > Gran Then
Лучший способ понять что-то самому — объяснить это другому.

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 24.10.2005 (Пн) 12:58

Файловый менеджер?

Насколько я знаю то, о чём ты говоришь можно сделать в Диспетчере задач, но это нежелательно, если ты только не знаешь как это можно сделать программно.
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 24.10.2005 (Пн) 13:05

1.В файловом менеджере щелкни правой кнопкой мышки.
2.Выбери СВОЙСТВА
3.Зайди на вкладку Программа
4.Напиши имя своей программы, и т.п.
5.Зайди на вкладку РАЗНОЕ
6.Поставь ползунок в нужное (приоритетное) положение.
Удачи!

Аналогично: TaskManages -> Процессы -> правый клик -> приоритет.
Однако не советую этого делать.
Лучший способ понять что-то самому — объяснить это другому.

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 24.10.2005 (Пн) 13:09

Попробовал с DoEvents.

Ощутимой разницы чегой-то не заметил.

Еще какие предложения?
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

575-61
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2005 (Пт) 8:09
Откуда: г.Ростов-на-Дону

Сообщение 575-61 » 24.10.2005 (Пн) 13:22

В TaskManages, это действительно не желательно потому, что загрузка под определенным адресом, а в процессе выполнения менять приоритет - это смерти подобно.
Всё относительно и всё есть - логический хаос.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 24.10.2005 (Пн) 13:25

Если есть циклы в FindMax, поставь DoEvents в самый вложенный. Так же интересно, что происходит после GoTo 1. Может там тоже циклы есть?
Лучший способ понять что-то самому — объяснить это другому.

Kiryusha
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 216
Зарегистрирован: 30.08.2005 (Вт) 10:56
Откуда: УР, Ижевск

Сообщение Kiryusha » 24.10.2005 (Пн) 13:32

Ok. БОЛЬШОЕ ВСЕМ СПАСИБО!!!

Теперь всё путём!

Кстати посмотрите тему "о почтовом ящике", может кто что знает???
Судебно-медицинское вскрытие показало, что чукча умер в
результате судебно-медицинского вскрытия.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.10.2005 (Пн) 14:29

575-61 писал(а):Создай *.Pif файл и отметь приоритет.

Pif-файлы можно создавать только для досовских прог.
Т.ч. твой совет не в тему.


575-61 писал(а):В TaskManages, это действительно не желательно потому, что загрузка под определенным адресом, а в процессе выполнения менять приоритет - это смерти подобно.

И что же такого страшного, расскажи, в изменении приоритета запущенного процесса :?:
Изображение

575-61
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2005 (Пт) 8:09
Откуда: г.Ростов-на-Дону

Сообщение 575-61 » 24.10.2005 (Пн) 14:43

Ну незнаю, я учился на 2 или баран.
1.В момент работы программы, стек ...., а изменяя приоритет, рушится старый и создается новый-в этот переходный момент теряется часть кодов (буферизация) не всегда, но бывает.
2.Pif файл это просто шеловская загрузка (виндовс также стоит в шеле) ну а приоритет задается между шелами (command.com)
Если я неправ, извините -посоветуйте или дайте мне урок.
Всё относительно и всё есть - логический хаос.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 24.10.2005 (Пн) 15:00

1.Чушь
2.Чушь полная

1 Ничего не теряется, просто операционка чаще или реже подсовывает процу процесс, у которого поменяли приоритет.
2. Шелл умер вместе с досом, а в пифе - параметры запуска консоли.
Лучший способ понять что-то самому — объяснить это другому.

MOV
Постоялец
Постоялец
 
Сообщения: 414
Зарегистрирован: 13.03.2004 (Сб) 15:13
Откуда: Санкт-Петербург

Сообщение MOV » 30.01.2006 (Пн) 16:22

Как ее отключить? Не вижу нихже :?
Это я про Recalc

575-61
Обычный пользователь
Обычный пользователь
 
Сообщения: 59
Зарегистрирован: 21.10.2005 (Пт) 8:09
Откуда: г.Ростов-на-Дону

Сообщение 575-61 » 31.01.2006 (Вт) 14:46

В VB или в VBA?
Всё относительно и всё есть - логический хаос.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 01.02.2006 (Ср) 8:36

2 Kiryusha

По собственному опыту знаю, что постоянное обращение к ячейкам экселя СИЛЬНО замедляет работу. Советую тебе работать не с отдельными ячейками, а с Range - т.е. выделяешь БОЛЬШОЙ Range, копируешь его в вариантный массив и работаешь с массивом. Запись в таблицу осуществляй аналогично.
А я все практикую лечение травами...

HotKitten
Дятил
Дятил
Аватара пользователя
 
Сообщения: 400
Зарегистрирован: 24.01.2005 (Пн) 21:48
Откуда: из дома

Re: Как уменьшить использование ЦП

Сообщение HotKitten » 01.02.2006 (Ср) 10:39

Kiryusha писал(а):Кто знает напишите, как сделать выбор приоритета.

вот код глянь, из проги выдернул, вроде ничего не забыл
Код: Выделить всё
Public Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Public Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Public Declare Function GetCurrentThread Lib "kernel32" () As Long
Public Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long
Public Declare Sub SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
Public GraphPoints(0 To 99) As Long

'использование
    SetThreadPriority GetCurrentThread, THREAD_BASE_PRIORITY_MAX
    SetPriorityClass GetCurrentProcess, HIGH_PRIORITY_CLASS
Изображение

ReMAG
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 54
Зарегистрирован: 02.10.2005 (Вс) 4:01
Откуда: Киев

Сообщение ReMAG » 06.02.2006 (Пн) 2:37

А может просто использовать Sleep :?:
Я когда-то так делал регулируемую загрузку проца...
Никогда не говори "никогда"...

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 125

    TopList