Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Нагрузка на проц в циклах Добавлено: 09.04.10 10:08  

Автор вопроса:  Spiritsun
Всем привет. У меня самый простой вопрос, может кто знает. Почему циклы так грузят проц и как этого избежать? У меня 2 ядра и 1-ый под 100%. Вот пример:

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Do
        Loop
    End Sub
End Class

Вместо Do пытался вставить goto, както поэксперементировать, результат тотже. Самже я использую подобные циклы для проверок GetAsyncKeyState. Api функцию Sleep, чтобы делать задержки в этих циклах пытаюсь избегать, т.к. отрицательно влияет на работу в самих циклах. Вот как она выглядит:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)

Ответить

  Ответы Всего ответов: 26  

Номер ответа: 1
Автор ответа:
 Spiritsun



Вопросов: 15
Ответов: 44
 Профиль | | #1 Добавлено: 09.04.10 11:29
И еще, почему только на одно ядро, когда у меня компиляция под любой процессор и у меня 2 ядра?

Ответить

Номер ответа: 2
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #2
Добавлено: 09.04.10 11:52
Второе ядро тебе никто не даст загрузить так просто. Заюзай еще пару потоков, если уж так хочешь загрузить оба ядра=)

Ответить

Номер ответа: 3
Автор ответа:
 Spiritsun



Вопросов: 15
Ответов: 44
 Профиль | | #3 Добавлено: 09.04.10 14:14
Да не, особо не волнует вопрос про распределения на потоки, но почитать бы хотел. Есть ссылка? А вот нагрузка на проц - проблема серъезная и наверняка частая, думаю тоже сталкивались, может и не обращали внимания. Гляньте в диспетчере задачь как работает ваша программа, если раньше такое использовали. Распишу подробней чем тут занимаюсь, может есть какаято альтернатива решающая мою проблему.

Запускается форма с единственной клавишей старта. При нажатии сворачивается. Далее идёт анализ нажатия клавиши. Этот анализ при свёрнутом окне получается совершить только функцией api GetAsyncKeyState и производится он в бесконечном замкнутом цикле. После нажатия вызывается определенная процедура, являющаяся основой программы. Я также использую таймер и там тоже проверяю другие нажатия клавиши тойже функцией, являющиеся более важными, которые могут повлиять на ход выполнения основной процедуры (Про таймер, наверное зря сказал, наверное особо тут не играет роль, вас только запутал). Вот пример:

  1. Imports System
  2. Imports System.IO
  3. Imports System.Globalization
  4. Imports System.Drawing.Imaging 'для скриншота
  5. Imports System.Windows.Forms
  6. Imports System.Windows
  7. Public Class Main
  8. Private Declare Function GetAsyncKeyState% Lib "user32" (ByVal vKey As Long) ' для прверки нажатия клавиши
  9. ...
  10. Private Sub Старт_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Старт.Click
  11. Do
  12. System.Windows.Forms.Application.DoEvents()
  13. If GetAsyncKeyState(&H25) And GetAsyncKeyState(&H11) Then 'если нажата Left+Ctrl
  14. ... ' вызов процедуры
  15. End If
  16. Loop
  17. End Sub
  18. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
  19. If GetAsyncKeyState(&H27) And GetAsyncKeyState(&H11) Then 'если нажата Right+Ctrl
  20.   End ' закрытие программы
  21. End If
  22. End Sub
  23. ...
  24. End Class

Ответить

Номер ответа: 4
Автор ответа:
 AWP



ICQ: 345685652 

Вопросов: 96
Ответов: 1212
 Web-сайт: xawp.narod.ru
 Профиль | | #4
Добавлено: 09.04.10 14:33
Таймер - альтернатива. Только им и надо подобные штуки делать, а не циклом))
А как ты хотел не загружать проц, если ты вызываешь api функцию миллион(дохрена) раз в секунду?

Ответить

Номер ответа: 5
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #5 Добавлено: 09.04.10 15:01
Блин, заюзал бесконечный цикл ,и удивляется, а почему это у меня проц так грузится?

Ответить

Номер ответа: 6
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #6
Добавлено: 09.04.10 15:12
http://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx

Ответить

Номер ответа: 7
Автор ответа:
 Spiritsun



Вопросов: 15
Ответов: 44
 Профиль | | #7 Добавлено: 09.04.10 17:08
AWP, дело не в вызове api функция миллионы раз. Смотри предыдущий пример с пустым do loop. Только таймером не могу воспользоваться, объясню почему. В теле проги после нажатия на Старт объявляются объекты bitmap и их размер зависит от параметров, загруженных с файла. Объект image и bitmap невозможно передать в процедуру Timer, а после и в др процедуры, что можно сделать из основного модуля. Вот пример как я делаю:

  1. Private Sub Старт_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Старт.Click
  2. ... ' загрузка параметров с файла
  3. Me.WindowState = System.Windows.Forms.FormWindowState.Minimized
  4. Dim tabpic As New Bitmap(1280, 1024) ' объект Bitmap для размещения в PictureBox на табло
  5. Dim gtabpic As Graphics = Graphics.FromImage(tabpic) ' управление Bitmap
  6. CreateTablo(tabpic, gtabpic)
  7. redr(tabpic, gtabpic)
  8. ...
  9. Do
  10. System.Windows.Forms.Application.DoEvents()
  11. If GetAsyncKeyState(&H25) And GetAsyncKeyState(&H11) Then 'если нажата Left+Ctrl
  12.     If tabshow Then
  13.        redr(tabpic, gtabpic)
  14.     End If
  15. End If
  16. ...
  17. Loop
  18. End Sub
  19. Public Sub redr(ByVal tabpic As Bitmap, ByVal gtabpic As Graphics)
  20. ...
  21. End Sub
  22. ...
  23. End Class


В этом случае я правда могу сделать tabpic глобальной, но если размеры Bitmap(1280, 1024) брать с файла настроек или определением тек разрешения соотв оператором, то только так. Есть др варианты?
А теперь представь, что подобные цыклы еще присутствуют в ожидании чегото и в итоге тормоза, что жуть. Может эту проблему исправили в новой версии vba этого года? Проверял ктонить?
Executioner, спасибо за наводку, только не понятно как мне это может помочь. Можеж объяснить, пжалста?

Ответить

Номер ответа: 8
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #8
Добавлено: 09.04.10 17:28
Ставим глобальный хук на клаву и следим за нажатием лавиш в системе. Для случая с горячими клавишами, имхо, вполне.

Ответить

Номер ответа: 9
Автор ответа:
 Spiritsun



Вопросов: 15
Ответов: 44
 Профиль | | #9 Добавлено: 09.04.10 20:20
Слуш помоги, а. Вроде как дело говориж, ток разобраться не могу. В гугле только устаревшая инфа и к vba 2008 не подходит. Адаптировать к моему случаю не получается. Вот некоторые ссылки:
http://visualprogs.medyal.ru/sample/57.html
http://www.vbforums.com/showthread.php?t=524686
http://vbnet.mvps.org/index.html?code/hooks/messageboxhooktimer.htm

Ответить

Номер ответа: 10
Автор ответа:
 Spiritsun



Вопросов: 15
Ответов: 44
 Профиль | | #10 Добавлено: 09.04.10 21:17
Подобная информация меня убивает. Это вроде как к делу не относится, но похожие зависания под 100% были:
http://stackoverflow.com/questions/2525731/vb-net-2008-ide-hanging-msvb7-dll-eating-100-cpu-when-editing-code
http://support.microsoft.com/kb/953595/

Ответить

Номер ответа: 11
Автор ответа:
 Spiritsun



Вопросов: 15
Ответов: 44
 Профиль | | #11 Добавлено: 09.04.10 22:21
Хорошо. Чтобы долго не придумывать, вот над чем щаз голову ломаю, могите тут реализовать hook. В vba 2008 не запускается. Возможно нужно дополнительно подключать какойто dll. Как и какой не знаю. Есть инфа, но не разобрался
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.ru/winui/winui/windowsuserinterface/windowing/hooks/usinghooks.htm#installing_releasing

  1. 'В форме
  2. Public Class Form1
  3.     'In a form, called Form1
  4.     Private Sub Form_Load()
  5.         'KPD-Team 2000
  6.         'URL: http://www.allapi.net/
  7.         'E-Mail: KPDTeam@Allapi.net
  8.         'set a keyboard hook
  9.         hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, 0, 0)
  10.     End Sub
  11.     Private Sub Form_Unload(ByVal Cancel As Integer)
  12.         'remove the windows-hook
  13.         UnhookWindowsHookEx(hHook)
  14.     End Sub
  15. End Class
  16.  
  17. 'в модуле
  18. Module Module1
  19.     Public Const WH_KEYBOARD = 2
  20.     Public Const VK_SHIFT = &H10
  21.     Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Object) As Long
  22.     Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
  23.     Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
  24.     Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  25.     Public hHook As Long
  26.     Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  27.         'if idHook is less than zero, no further processing is required
  28.         If idHook < 0 Then
  29.             'call the next hook
  30.             KeyboardProc = CallNextHookEx(hHook, idHook, wParam, lParam)
  31.         Else
  32.             'check if SHIFT-S is pressed
  33.             If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
  34.                 'show the result
  35.                 MsgBox("Shift-S pressed ...")
  36.             End If
  37.             'call the next hook
  38.             KeyboardProc = CallNextHookEx(hHook, idHook, wParam, lParam)
  39.         End If
  40.     End Function
  41. End Module

Еще при редактировании пишет ошибку на "AddressOf KeyboardProc" - невозможно преобразовать выражение AddressOf в Long, т.к. Long не яв-ся типом делегата. По сути прога должна при нажатии Shift-S вывести сообщение.

Ответить

Номер ответа: 12
Автор ответа:
 BG(Алексей)



Вопросов: 26
Ответов: 295
 Профиль | | #12 Добавлено: 10.04.10 01:57
ManualResetEvent

и

AutoResetEvent

тебе в помощь.

Ответить

Номер ответа: 13
Автор ответа:
 V1RTUOZ



Вопросов: 1
Ответов: 7
 Профиль | | #13 Добавлено: 10.04.10 15:01
Вот исходник на VB by Executioner (простите, со старого аккаунта зайти не могу, ибо он странным образом залочился:))
-
http://slil.ru/28936816

Ответить

Номер ответа: 14
Автор ответа:
 Spiritsun



Вопросов: 15
Ответов: 44
 Профиль | | #14 Добавлено: 10.04.10 15:08
знаете почему я всёже задался этим вопросом, может вспомните, кто писал когдато на старых языках программирования? Там подобные циклы были в порядке вещей и вообще никак не грузили проц. Как в бейсике, так и в ассемблере, паскале. Вот пример:
  1. 10 If [проверка клавиши] then goto 30
  2. 20 goto 10
  3. 30 ...

Ответить

Номер ответа: 15
Автор ответа:
 V1RTUOZ



Вопросов: 1
Ответов: 7
 Профиль | | #15 Добавлено: 10.04.10 16:31
Не важно в данном случае. Компилируется в одинаковый код.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам