Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пн окт 22, 2018 7:45 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 25 сообщений ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: Баг с кнопками
СообщениеДобавлено: Пт ноя 11, 2016 7:08 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 134
Не знаю, куда это писать, напишу здесь. Давно уже заметил этот баг. Во время длительной работы с системой, связанной с частым запуском и завершением приложений, происходит "отказ" кнопок в программах. Сначала отваливаются кнопки заголовков окон, а затем и все остальные. Долго мне было непонятно отчего это происходит и как воспроизвести этот баг, но вот я нашел
способ. Запускаем программу period в 10 экземплярах, и кнопки закрыть/свернуть перестают работать. То же самое можно проделать с приложением calc, но тогда его нужно запустить в 28 экземплярах. Очевидно, что быстрота достижения этого эффекта зависит от количества кнопок в программе. В описании функции 8 сказано, что максимальное число кнопок во всех программах - 4095, здесь же только ~1200 кнопок.
Вряд ли от этого что-то зависит, но на всякий случай: VMware, 2Gb, 1366x768.


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 12:33 am 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4814
Баг давно висел в http://bugs.kolibri-n.org/?id=18

Я написал крохотную программу (в аттаче), чтобы проверить действительно ли баг имеет место быть.
Код:
void main()
{
   int i=0;
   word btn;
   loop() switch(WaitEvent())
   {
      case evButton:
         btn = GetButtonID();               
         if (btn == 1) ExitProcess();
         notify(itoa(btn));
         break;
      
      case evReDraw:
         DefineAndDrawWindow(100, 100, 350, 300, 0x34, 0xEEEeee, "Window title",0);
         if (i==0) for (i=0; i<5000; i++) UnsafeDefineButton(10,10, 80,20, i, 0xcccCCC);
         break;
   }
}

Она создает 5000 кнопок. После того как кнопки создались, следует щелкнуть на видимую кнопку (которая создалась последней) => через notify отобразится ее ID.
У меня это получилось 4044.

Изображение


Вложения:
bug_with_buttons.zip [1.75 КБ]
1 скачивание

_________________
Через тернии к звездам
Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 2:34 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 134
Я имел в виду несколько другое.
Можно сделать программу, которая создает 900 кнопок (30x30) (id = 17..916).
При нажатии на кнопку, программа выводит на доску отладки id кнопки. Здесь всё правильно, но если запустить три экземпляра такой программы, то кнопки "закрыть" и "свернуть" перестают работать.
Попробуй сделать так, как на скриншоте и увидишь, что закрыть окна нажатием на крестик будет невозможно (в том числе и окно Eolite).
Спойлер: Показать
Вложение:
1.PNG
1.PNG [ 40.69 КБ | 455 просмотров ]


Вложения:
BUTTONS [6.85 КБ]
5 скачиваний
Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 9:31 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1485
sysfuncs.txt писал(а):
* Total number of buttons for all applications is limited to 4095.
akron1 писал(а):
здесь же только ~1200 кнопок.
Надо считать, сколько всего во всей системе в данный момент кнопок.
Какие-то программы могут работать неправильно: не удалять уже нарисованные кнопки.
Была похожая проблема с программой @SS - скринсейвер


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 11:21 am 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4814
В общем, да, баг есть. Надо смотреть исходник BUTTONS и надо дебажить ядро.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 1:37 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1485
Добавил в button.inc вывод на доску отладки(DEBUGF) вот тут
Код:
syscall_button: ;////////////// system function 8 //////////////
.................................................................
        ; do we actually need to undefine the button?
        test    edx, 0x80000000
        jnz     .remove_button

        ; do we have free button slots available?
        mov     edi, [BTN_ADDR]
        mov     eax, [edi]
        cmp     eax, button.MAX_BUTTONS
        jge     .exit
DEBUGF  1, "K : Buttons = %d\n", eax
akron1 писал(а):
можно проделать с приложением calc
Попробовал, вывод на BOARD
Спойлер: Показать
Вложение:
1.PNG
1.PNG [ 27.95 КБ | 393 просмотра ]
При двойном щелчке на кнопки закрытия и сворачивания происходит максимизация окна(если оно sizable), при нажатии правой кнопкой мыши — сворачивание в заголовок, а минимизация и закрытие не работает.

Ещё вариант:
    Запустите BOARD
    Запустите Process manager(CPU)
    Наблюдайте постепенное увеличение количества кнопок на BOARD("Buttons = ")
Спойлер: Показать
Вложение:
1.PNG
1.PNG [ 58.68 КБ | 393 просмотра ]
Если кому интересно — вот моя сборка
Вложение:
kolibri.img.7z [1.23 МБ]
9 скачиваний


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 4:04 pm 
Не в сети

Зарегистрирован: Сб апр 22, 2017 6:11 pm
Сообщения: 214
Может заодно перенести код:
Код:
;---------------------------------------------------------------
sys_button_perform_handler:
;---------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;---------------------------------------------------------------
        shl     eax, 8
        mov     al, cl
        movzx   ebx, byte[BTN_COUNT]
        mov     [BTN_BUFF + ebx * 4], eax
        inc     bl
        mov     [BTN_COUNT], bl
        ret

из button.inc в mouse.inc (я не увидел, чтобы где-то ещё использовался вызов call sys_button_perform_handler).

В обработке курсора мыши есть деактивация системных кнопок, всякое бывает - вдруг как-то срабатывает, повесь обработчик где-то здесь:
Код:
 ; did we press some button earlier?
        cmp     [mouse.active_sys_button.pbid], 0
        je      .buttons_changed

        ; yes we did, deactivate it
        xor     eax, eax
        xchg    eax, [mouse.active_sys_button.pbid]
        mov     ebx, [mouse.active_sys_button.coord]
        mov     cl, [mouse.active_sys_button.buttons]
        push    eax ebx
        call    sys_button_deactivate_handler
        pop     edx ecx

        ; is the button under cursor the one we deactivated?
        call    mouse._.find_sys_button_under_cursor
        cmp     eax, ecx
        jne     .exit
        cmp     ebx, edx
        jne     .exit

        ; yes it is, perform associated action
        mov     cl, [mouse.active_sys_button.buttons]
        call    sys_button_perform_handler
        jmp     .exit

К тому же у событий свой буфер нажатых кнопок, который ограничен байтом:
Код:
BTN_COUNT           = OS_BASE + 0x000F500
BTN_BUFF            = OS_BASE + 0x000F501

Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?
Цитата:
создаются две стандартные кнопки: закрытия окна с идентификатором 1 и минимизации окна с идентификатором 0xffff.
Кнопка с идентификатором 0xffff при нажатии интерпретируется системой как кнопка минимизации, система обрабатывает такое нажатие самостоятельно, не обращаясь к приложению. В остальном это обычная кнопка.
Общее количество кнопок для всех приложений ограничено числом 4095.


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 4:53 pm 
Не в сети

Зарегистрирован: Вс авг 09, 2015 3:41 pm
Сообщения: 100
theonlymirage писал(а):
Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?

Код:
xor dx, dx
dec dx

или
Код:
mov dx, -1


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 6:26 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1485
theonlymirage писал(а):
Может заодно перенести код:
Код:
;---------------------------------------------------------------
sys_button_perform_handler:
;---------------------------------------------------------------
;> eax = pack[8(process slot), 24(button id)]
;> ebx = pack[16(button x coord), 16(button y coord)]
;> cl = mouse button mask this system button was pressed with
;---------------------------------------------------------------
        shl     eax, 8
        mov     al, cl
        movzx   ebx, byte[BTN_COUNT]
        mov     [BTN_BUFF + ebx * 4], eax
        inc     bl
        mov     [BTN_COUNT], bl
        ret

из button.inc в mouse.inc (я не увидел, чтобы где-то ещё использовался вызов call sys_button_perform_handler).
Думаю, не стоит.
В window.inc тоже есть некоторые handler
    sys_window_maximize_handler
    sys_window_rollup_handler
    sys_window_end_moving_handler
    sys_window_moving_handler
Тогда и их по логике тоже надо переносить.
theonlymirage писал(а):
Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?
Одно с другим не связано. Это просто идентификатор и он не обязан быть меньше числа 4096. Вполне может быть равен, например, 8192 и более, если это удобно приложению.


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 6:54 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 134
Цитата:
Ещё вариант:
Запустите BOARD
Запустите Process manager(CPU)
Наблюдайте постепенное увеличение количества кнопок на BOARD("Buttons = ")


Вот, точно. Я обычно замечал эффект "отказа" кнопок во время программирования в KolibriOS. А во время кодинга часто приходится открывать Process manager, чтобы прервать программу, которая зациклилась, и обычно через 1-2 часа приходилось перезапускать систему из-за полной неработоспособности кнопок.


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 7:38 pm 
Не в сети

Зарегистрирован: Сб апр 22, 2017 6:11 pm
Сообщения: 214
Лично я трогать не буду, но я бы перенёс только этот кусок, окна бы оставил; но ладно. Если возникнет необходимость, то перенести всегда успеете.

0CodErr писал(а):
Это просто идентификатор и он не обязан быть меньше числа 4096. Вполне может быть равен, например, 8192 и более, если это удобно приложению.

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


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 9:31 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4814
Pipes при каждом клике создавало все кнопки заново не удаляя старые и на 2 уровне примерно все кнопки отваливались. Cpu тоже нужно сделать чтобы старые кнопки удалялись.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Вт сен 11, 2018 10:44 pm 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 134
Еще утечка кнопок есть в главном меню, если открыть меню и водить по нему мышью. Но это не так критично, конечно. А вот CPU каждую секунду создает 24 новые кнопки. Ну что ж, теперь хотя бы понятно, в чем проблема.


Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Ср сен 12, 2018 12:04 am 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4814
Проверьте в этой версии CPU проблема с дублирующимися кнопками исправлена?


Вложения:
cpu.kex [1.79 КБ]
2 скачивания

_________________
Через тернии к звездам
Вернуться к началу
 Заголовок сообщения: Re: Баг с кнопками
СообщениеДобавлено: Ср сен 12, 2018 12:09 am 
Не в сети

Зарегистрирован: Вс окт 27, 2013 8:13 pm
Сообщения: 134
Да, теперь нормально.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 25 сообщений ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB