FreeBasic
Главная
Вход
Регистрация
Вторник, 15.10.2024, 16:29Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Нагрузка на центральный процессор.
off_lineДата: Понедельник, 24.06.2013, 12:04 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
Возможно, ради этого вопроса не стоило создавать новую тему, но все же.
Решил для изучения языка прочесть книгу Кларка "Давайте сделаем рогалик" и поэкспериментировать с кодом. Дошел до пятой главы, о генерации персонажа.
Проблема же вот в чем: программа сразу при запуске грузит одно из ядер под завязку, на 98-100 процентов (в общей сложности нагрузка 50%, компьютер двухядерный). При этом переключение на другую программу или даже просто окно происходит с трехсекундной задержкой и вдобавок зависает языковая панель — становится невозможным переключить язык. Сама программа при этом работает нормально, оперативной памяти ей требуется порядка 8000 килобайт.
Провел простенький тест и запустил зацикленный вывод в консоль слова "test". Нагрузка сразу же подскакивает до 35-40%. Поставил в конце цикла "sleep 10" — нагрузка упала до 1-3%. Сделал тоже самое во всех циклах программы, но не помогло.
Потом подключил к процессу второе ядро с помощью одной программки, часть нагрузки перекинулась, но общая так и осталась на планке в ровно 50%, переключение между программами и окнами все так же тормозит.
Начал поочередно отключать процессы через диспетчер, но безрезультатно.
Что это может быть? Проблема с оптимизацией, ошибки в коде или что-то с моим компьютером?
Прикрепления: 6515244.png (8.2 Kb)
 
haavДата: Понедельник, 24.06.2013, 17:28 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Я запустил исходники с пятой главы. Тестировал на 2 компах (оба двухядерники).

На основном загрузка 5-7%
На ноуте (там проц послабее) 13-15%

Тесты проводил под Windows 7. У меня не стоит никаких антивирусов и прочей дряни, тормозящих систему.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
off_lineДата: Понедельник, 24.06.2013, 18:08 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
Извиняюсь, я забыл сказать, что запускал код не из книги Кларка. Мой код несколько отличается от исходников (тем, что он куда более громоздкий и корявый). Да, еще опытным путем установлено, что такой провис случается в главном меню. Как только перехожу в подменю, нагрузка возвращается к норме, хотя языковая панель все еще глючит. Возможно ли, что дело во вложенных циклах? В главном файле кроме вложенных циклов  и команд для подключения вспомогательных файлов больше нет ничего.

 
haavДата: Понедельник, 24.06.2013, 19:14 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Я не могу запустить код, не хватает файлов:

Цитата
#Include "utilites.bi"
#Include "mainmenu.bi"

Но даже без них вижу нехорошее:

Цитата
GoTo MRECYCLE

Дело в том, что в отличии от привычных старых диалектов бейсика , у freebasic блоки if-endif, select-case, do-loop и прочие имеют свою область видимости, из которой прыжки с помощью goto могут привести к таким же результатам как прыжок из процедур и функций (т.е непредсказуемым).

Почему бы просто не сделать так:

Код
                     If nchRet = 10 Then
                            nchRet = 0
                            nemRet = 0
                            mamRet = 0
                            'GoTo MRECYCLE
                            MainMenu()

А вообще лучше бы выложить рабочий вариант с проблемой загрузки проца. А так это гадание на кофейной гуще.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
off_lineДата: Понедельник, 24.06.2013, 19:39 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
Подозреваю, что код новичка может вызвать кровавые слезы.
Запаковал в архив.
http://rghost.ru/46987808

"Почему бы просто не сделать так:"
Хм. Мне почему-то казалось, что без зацикливания оно работать не будет. Видимо, я ошибался.


Сообщение отредактировал off_line - Понедельник, 24.06.2013, 19:45
 
haavДата: Понедельник, 24.06.2013, 20:04 | Сообщение # 6
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Я сильно не разбирался, но в файле mainmenu.bi нелогично вставлены sleep. Их надо вставлять в цикл:

Код
'Главное меню.
Sub MainMenu()
     'Отрисовка номера версии.
     Dim As String VerNum = "v0.01   off_line, 2013"
     Dim As Byte VerNumX = 105, VerNumY = 93
     DrawMainBG
     ScreenLock
     Draw String (VerNumX * TileW, VerNumY * TileH), VerNum, ColorSand
     ScreenUnLock
      
     Dim As Byte mamOff = 0
     Dim As String mamKey
      
     DrawMainMenu(mamRet)
      
     Do
         mamKey = InKey
         If mamKey <> "" Then
             If mamKey = key_esc Or mamKey = key_close Then
                 End
             ElseIf mamKey = key_enter Then
                 mamOff = 1
                 If mamKey = key_enter And mamRet = 3 Then End
             ElseIf mamKey = key_up Then
                 mamRet-=1
                 DrawMainMenu(mamRet)
                 If mamRet < 0 Then mamRet = 3: DrawMainMenu(mamRet)
             ElseIf mamKey = key_dn Then
                 mamRet+=1
                 DrawMainMenu(mamRet)
                 If mamRet > 3 Then mamRet = 0: DrawMainMenu(mamRet)
             EndIf
         EndIf
         sleep 10,1
     Loop Until mamOff = 1
      
     ClearKeys
      
End Sub

'Меню новой игры.
Sub NewGame()
     Dim As Byte nemOff = 0
     Dim As String nemKey
      
     DrawNewGame(nemRet)
      
     Do
         nemKey = InKey
         If nemKey <> "" Then
             If nemKey = key_close Then
                 End
             ElseIf nemKey = key_esc Then
                 nemOff = 1
                 nemRet = 3
             ElseIf nemKey = key_enter Then
                 nemOff = 1
             ElseIf nemKey = key_up Then
                 nemRet-=1
                 DrawNewGame(nemRet)
                 If nemRet < 0 Then nemRet = 3: DrawNewGame(nemRet)
             ElseIf nemKey = key_dn Then
                 nemRet+=1
                 DrawNewGame(nemRet)
                 If nemRet > 3 Then nemRet = 0: DrawNewGame(nemRet)
             EndIf
         EndIf
         sleep 10,1
     Loop Until nemOff = 1
      
     ClearKeys
      
End Sub

Если так сделаешь , то загрузка проца упадет к нулю. И конечно стоит удалить метку

Цитата
MRECYCLE:


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
off_lineДата: Вторник, 25.06.2013, 04:18 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
Точно! Поменял расположение двух строк, теперь все нормально.
А вот языковая панель виснет в любой программе, даже самой простой, если включен графический режим.

В любом случае, спасибо за терпение и желание помочь новичку.
 
haavДата: Вторник, 25.06.2013, 07:42 | Сообщение # 8
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Цитата (off_line)
Точно! Поменял расположение двух строк, теперь все нормально.А вот языковая панель виснет в любой программе, даже самой простой, если включен графический режим.

В любом случае, спасибо за терпение и желание помочь новичку.


Ну с языковой панелью, при использовании граф. окна, точно что-то не так. Когда я запускаю графическое окно, у меня попросту раскладки не переключаются ни кнопкой внизу ни по горячим клавишам.  Если бы не punto switcher сделать этого было бы невозможно. Я помню похожая хрень была в одной игре от Akela. Там я не мог ввести серийный номер ,чтобы залицензировать продукт из-за того, что при запуске была кириллица и переключиться было невозможно. Приходилось лезть в настройки системы, ставить по умолчанию английскую... 

Кстати эта бага только на винде. На linux все путем. Надо об этом написать на оф. сайте.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
off_lineДата: Вторник, 25.06.2013, 23:42 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
А вот заставить программу переключаться на английский при запуске возможно?
 
haavДата: Среда, 26.06.2013, 06:14 | Сообщение # 10
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Цитата (off_line)
А вот заставить программу переключаться на английский при запуске возможно?


В этом топике я писал пример. Там переключение идет не жестко на английскую раскладку, но если учесть что у русскоязычных пользователей стоят раскладки RUS<>ENG , это работает.

Но можно прямо устанавливать английскую раскладку (заменить в коде на это):

Код
' Работает только на винде
#ifdef __FB_WIN32__
#Include "windows.bi"
     Dim As HKL enghkl = LoadKeyboardLayout("00000409",KLF_ACTIVATE+KLF_SETFORPROCESS)
    ActivateKeyboardLayout(enghkl ,KLF_SETFORPROCESS)
#EndIf

Если заменить 00000409 на 00000419 , то будет русская. Это работает только на винде. На linux тоже есть способы, но я не вдавался.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
off_lineДата: Среда, 26.06.2013, 22:51 | Сообщение # 11
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
Попробовал по вашему совету. Значок языковой панели сразу же пропадает. Я поставил английский как стандартный, только в этом случае работает.
 
haavДата: Четверг, 27.06.2013, 06:13 | Сообщение # 12
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Цитата (off_line)
Попробовал по вашему совету. Значок языковой панели сразу же пропадает. Я поставил английский как стандартный, только в этом случае работает.


Вне зависимости от того, что показывает значок на панели, раскладка должна меняться. Это можно попробовать при вводе текста с клавы. Например GetKey с русской раскладкой, при нажатии любой клавиши,  возвращает код 63 (то есть неопределенный) , при английской раскладке как положено. Я написал об этом на оф. сайте , но пока дело глухо...

Я бы сделал в программе свою реализацию переключения раскладки с помощью кода , который привел выше. А на значок бы вообще задвинул.

P.S. Давай на ты.


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
haavДата: Четверг, 27.06.2013, 08:04 | Сообщение # 13
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Вот пример, обрати внимание на возвращаемые символы и не смотри на значок раскладки в трее (переключение ALT+SHIFT):

Код
#Include "windows.bi"
#Include "fbgfx.bi"
Using FB

Screen 1
Dim As Integer iFlag
Dim As Double tTimer
Dim e As EVENT
Do
      Sleep(10)

      if Timer - tTimer >0.5 then iFlag = 1
      if iFlag = 1 then
          If MultiKey(SC_ALT) And MultiKey(SC_LSHIFT) Then
              tTimer = Timer
              ActivateKeyboardLayout(Cast(HKL,HKL_NEXT) ,KLF_SETFORPROCESS)
              iFlag = 0
          EndIf
      EndIf
     If (Screenevent(@e)) Then   
          Select Case e.type    
              Case EVENT_KEY_PRESS
                  Print "scancode pressed key: " & chr(e.ascii)   
              Case EVENT_KEY_RELEASE
                  Print "scancode released key:  " & Chr(e.ascii)
          End Select
      End If    
Loop Until MultiKey(1)


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


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
off_lineДата: Суббота, 29.06.2013, 10:55 | Сообщение # 14
Рядовой
Группа: Пользователи
Сообщений: 9
Репутация: 0
Статус: Offline
Спасибо, haav! Вот это хороший работающий пример.
 
  • Страница 1 из 1
  • 1
Поиск: