Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282

Медленное срабатывание условия

03.09.2013, 12:47. Показов 2177. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть примерно такой код
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Global ss.s, os.s
Procedure.s cent(ss.s)
  If OpenConsole()
    EnableGraphicalConsole(1)
    If ss <> os.s
      PrintN(ss)
    EndIf
    os=ss
    If Inkey()
      Print(">")
       Name$ = Input()
       PrintN(Name$)
     EndIf
  EndIf
EndProcedure
OpenWindow(0,100,100,200,200,"test",#PB_Window_SystemMenu) 
EditorGadget(1, 0, 120, 200, 30)
ButtonGadget(2, 50,170,100,20,"send")
Repeat
  cent("start")
  Event = WaitWindowEvent() 
  If EventGadget() = 2 And event = #PB_Event_Gadget
    st.s = GetGadgetText(1)
    TextGadget(3,0,0,100,80,st)
    ClearGadgetItems(1)
    EndIf
  Until Event = #PB_Event_CloseWindow
суть в том что условие в процедуре срабатывает через секунд 30 то есть вот это:
If Inkey()
Print(">")
Name$ = Input()
PrintN(Name$)
EndIf
при чём странно срабатывает, - получает все переменные введённые в консоль но отображает их с опазданием. Основное же окно работает исправно.
Как я понимаю команда Print(">") должна сработать на следующем проходе цикла, но както опаздывает...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2013, 12:47
Ответы с готовыми решениями:

Медленное срабатывание mute()
Прикрепил прототип, можете у себя проверить? Задача: по нажатию на итем звук идёт с него, а остальные глушатся. Что происходит: звук...

При возникновении ошибки OutOfRange вывести последнее успешное срабатывание условия
for i in range(m): if l=='-' and l=='-': del(l) m-=1 print(l) Нужно чтобы при возникновение...

Внутри проверки условия не производится ещё одна проверка условия
Как задумывалось - при нажатии на джойстик просто должны были остановится движки, но если при этом нажат джойстик по оси Y в опр...

17
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
03.09.2013, 13:50
В этом коде есть несколько нюансов из-за которых он работает не так, как задумано.
Во первых, функция WaitWindowEvent() ожидает событий в окне (а не в консоли) и на время ожидания, код не выполняется, т. е. процедура cent() не будет вызываться когда нет оконных событий. Это можно обойти указав таймаут ожидания события, например, 100 миллисекунд.
PureBasic
1
Event = WaitWindowEvent(100)
Второй нюанс заключается в том, что функция Input(), ожидает нажатия Inter и на это время программа "повиснет" в этой функции, а значит события окна обрабатываться не будут.
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
03.09.2013, 14:13  [ТС]
locm, а можно ли как-то оптимизировать код? суть процедуры сводится к выводу сообщений. Или ка либо прировнять ожидание к нулю, то есть чтобы не приходилось ожидать от 30 секунд?

хотя мне казалось не смотря на название что вэйтвиндовевент просто получает событие, иначе зачем её заключать в цикл?
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
03.09.2013, 16:35
Если нужен только вывод в консоль, то код можно упростить.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
OpenConsole()
 
OpenWindow(0,100,100,200,200,"test",#PB_Window_SystemMenu) 
EditorGadget(1, 0, 120, 200, 30)
ButtonGadget(2, 50,170,100,20,"send")
TextGadget(3,0,0,100,80, "")
 
PrintN("start")
 
Repeat
  Event = WaitWindowEvent() 
  If event = #PB_Event_Gadget And EventGadget() = 2
    st.s = GetGadgetText(1)
    SetGadgetText(3, st)
    PrintN(st)
    ClearGadgetItems(1)
  EndIf
Until Event = #PB_Event_CloseWindow
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
03.09.2013, 16:58  [ТС]
locm, не совсем, вся соль вопроса в том чтобы функция input() не блокировала выполнение программы. то есть в итоге должен получится типа-дебугер-корректировщик где cent("сообщение") = debug ("сообщение") но есть возможность в самом ходе программы задать значение переменной либо действие. Но вот тормоза в 30 сек никак не радуют.... хотел открыть второе окно, но в консольном режиме както круче
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
03.09.2013, 17:18
Функция Input() блокирует работу пока не нажмут Enter. Так она устроена.
Можно сделать ввод используя функцию Inkey(), складывая все введенные символы в переменной и завершая ввод по нажатию Enter.
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
03.09.2013, 17:26  [ТС]
locm, сложновато будет, причём очень... вед охото видеть что печатуеш... так то вроде норм придумал, в цикле без виндовсевент работает на ура...
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
03.09.2013, 17:32
Можно работать с консолью с параллельном потоке, но неизвестно что из этого выйдет.
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
03.09.2013, 17:41  [ТС]
locm, то есть? одновременный запуск двух программ? думал... тогда уж лучше батник написать...
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
03.09.2013, 19:01
Цитата Сообщение от logincyberforu Посмотреть сообщение
одновременный запуск двух программ
Нет. Имел в виду многопоточность.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
CompilerIf #PB_Compiler_Thread=0
  CompilerError "Включите поддержку многопоточности"
CompilerEndIf
 
Procedure cent(*Point)
  Repeat
    If Inkey()
      Print(">")
      Name$ = Input()
      PrintN(Name$)
    Else
      Delay(400)
    EndIf
  ForEver
EndProcedure
 
OpenConsole()
 
OpenWindow(0,100,100,200,200,"test",#PB_Window_SystemMenu) 
EditorGadget(1, 0, 120, 200, 30)
ButtonGadget(2, 50,170,100,20,"send")
TextGadget(3,0,0,100,80,"")
PrintN("start")
 
CreateThread(@cent(), 0)
 
Repeat
  Event = WaitWindowEvent() 
  If event = #PB_Event_Gadget And EventGadget() = 2
    st.s = GetGadgetText(1)
    SetGadgetText(3, st)
    ClearGadgetItems(1)
  EndIf
Until Event = #PB_Event_CloseWindow
В окне "Настройки компилятора" нужно включить поддержку многопоточности.
1
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
04.09.2013, 16:47  [ТС]
locm, Благодарю, работает как нужно. Только вот не смог найти где нужно включить многопоточность, поэтому тупо вырезал первые три строки. Только не понятно зачем пауза если не нажата клавиша, то есть
else
delay(400)
endif
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
04.09.2013, 17:16
Цитата Сообщение от logincyberforu Посмотреть сообщение
Только вот не смог найти где нужно включить многопоточность
Цитата Сообщение от locm Посмотреть сообщение
В окне "Настройки компилятора" нужно включить поддержку многопоточности.
Нужно в меню "Компилятор" кликнуть по "Настройки компилятора" и на вкладке "Параметры" включить поддержку многопоточности.
Естественно это нужно сделать при открытом исходнике и вкладка с ним должна быть активной, потому что, если не создан проект, то эти настройки сохраняются в исходнике.

Цитата Сообщение от logincyberforu Посмотреть сообщение
Только не понятно зачем пауза если не нажата клавиша
Если ее убрать, то будет грузить по полной одно из ядер процессора.
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
04.09.2013, 17:31  [ТС]
locm, то есть "создать приложение с безопамным потоком" ?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
04.09.2013, 17:55
Цитата Сообщение от locm Посмотреть сообщение
грузить по полной одно из ядер процессора.
Это утверждение не верно для современных процессоров. При 4-х ядрах максимальная загрузка на одно из ядер ~25%, остальные 12-5%, при 2-х ядрах около 50%, т.о. процессор не настолько глуп, как вы думаете, и распределяет нагрузку на ядра равномерно по умолчанию. Только программист может испортить эту гармонию, переопределив нагрузки на ядрах - но в Вашем коде я этого явно не вижу, а PureBasic видимо не настолько глуп, чтобы что то менять по умолчанию.

P.S. НЕ беру в расчет древние процы с одним ядром, тут альтернативы нет, нужно обязательно Delay, Sleep и т.п.
0
Эксперт по электронике
6493 / 3123 / 331
Регистрация: 28.10.2011
Сообщений: 12,277
Записей в блоге: 7
04.09.2013, 18:02
Цитата Сообщение от logincyberforu Посмотреть сообщение
то есть "создать приложение с безопамным потоком"
Да, но зависит от конкретного русификатора.
Корректнее это было бы перевести как: "Поддержка многопоточности".

Цитата Сообщение от Pro_grammer Посмотреть сообщение
Это утверждение не верно для современных процессоров. При 4-х ядрах максимальная загрузка на одно из ядер ~25%
Вы путаете загрузку процессора и загрузку одного из ядер процессора.
25% загрузка процессора, это 100% загрузка одного из ядер, 4-ёх ядерного процессора. И не имеет значения как ОС распределяет нагрузку между ядрами. Ведь один поток не может нагрузить все 4 ядра, а полноценно нагружает только одно ядро.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
04.09.2013, 18:51
Цитата Сообщение от locm Посмотреть сообщение
будет грузить по полной одно из ядер процессора.
Цитата Сообщение от Pro_grammer Посмотреть сообщение
загрузка на одно из ядер ~25%
Вы сказали, что одно из ядер будет грузиться по полной? По полной это 100%! Я сказал, что в зависимости от кол-ва ядер нагрузка распределится и это правда, 100% загрузка может быть только если одно ядро, или возможно на каком то 2-х процессорном старье ( нет возможности проверить, нет в наличии такой древности). Где противоречия, что не так?
0
04.09.2013, 19:36

Не по теме:

Pro_grammer, не цепляйтесь к словам. И так понятно что имелось в виду то, что один поток может максимум использовать дно ядро, но как система раскидает загрузку по ядрам, это уже не имеет значения, ведь один поток не может по полной использовать все ядра. Он использует только ресурсы процессора, эквивалентные одному ядру. Но так или иначе, зачем чтобы эти ресурсы использовались зря? Это особенно актуально для ноутбуков.

Но раз уж вы решили придраться к словам, то и я могу это сделать (помните: "не судите и не судимы будете"!).

Цитата Сообщение от Pro_grammer Посмотреть сообщение
процессор не настолько глуп, как вы думаете, и распределяет нагрузку на ядра равномерно по умолчанию
Во первых, у процессора ума нет, а во вторых, нагрузку распределяет не процессор, а планировщик процессов ОС.

0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
04.09.2013, 20:43
Цитата Сообщение от locm Посмотреть сообщение
нагрузку распределяет не процессор, а планировщик процессов ОС.
Возможно, я не сильно в этом разбираюсь
Но в любом случае я к словам не придирался, просто посмотрел реальную загрузку своего современного процессора i7 на 4 реальных ядрах в двух случаях - с использованием Delay и без оного. С использованием ~ 0%, без использования на одно из ядер ~25%, остальные 12-5%. Это ни как не "грузится по полной" - разъясню, что что это означает: ни одно ядро из 4-х не работает на полную мощность, мах на четверть. . Реально задержки в работе других приложений Вы не заметите. Ну, а свое приложение, дураку понятно, что надо правильно сделать, красиво отладить
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.09.2013, 20:43
Помогаю со студенческими работами здесь

Описать оператор выбора, в котором при истинности второго условия выполняются действия и третьего условия тоже
помогите пожалуйста ответить на вопрос 2. Описать оператор выбора, в котором при истинности второго условия выполняются действия и...

Медленное зависание
Конфиг i7 6700, GTX 980, 16 RAM, ssd 128, 2x1TB hdd Время от времени зависает система, причем медленно, сначала браузер виснет например,...

медленное продвижение
Всех приветствую подскажите как лучше продвигать сайт студия работает в режиме интернет магазина, занимается продажей мебели...

Медленное чтение
Здравствуйте,это опять снова я.В этой теме я писал про проблему раскрутки шпинделя.Слава Богу подобной проблемы больше нет.Но я появилась...

Медленное соединение
У меня связь с интернетом - 64 килобайта (живу на Дальнем Востоке). Но при работе с интернетом складывается ощущение что скорость килобайт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru