Board.KolibriOS.org

Official KolibriOS board
It is currently Fri Apr 26, 2019 3:11 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 25 posts ]  Go to page 1 2 Next
Author Message
PostPosted: Fri Nov 11, 2016 7:08 pm 
Offline

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


Top
   
PostPosted: Tue Sep 11, 2018 12:33 am 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4994
Баг давно висел в http://bugs.kolibri-n.org/?id=18

Я написал крохотную программу (в аттаче), чтобы проверить действительно ли баг имеет место быть.
Code:
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.

Image


Attachments:
bug_with_buttons.zip [1.75 KiB]
Downloaded 22 times

_________________
Через тернии к звездам
Top
   
PostPosted: Tue Sep 11, 2018 2:34 am 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 141
Я имел в виду несколько другое.
Можно сделать программу, которая создает 900 кнопок (30x30) (id = 17..916).
При нажатии на кнопку, программа выводит на доску отладки id кнопки. Здесь всё правильно, но если запустить три экземпляра такой программы, то кнопки "закрыть" и "свернуть" перестают работать.
Попробуй сделать так, как на скриншоте и увидишь, что закрыть окна нажатием на крестик будет невозможно (в том числе и окно Eolite).
Spoiler: Show
Attachment:
1.PNG
1.PNG [ 40.69 KiB | Viewed 952 times ]


Attachments:
BUTTONS [6.85 KiB]
Downloaded 26 times
Top
   
PostPosted: Tue Sep 11, 2018 9:31 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
* Total number of buttons for all applications is limited to 4095.
akron1 wrote:
здесь же только ~1200 кнопок.
Надо считать, сколько всего во всей системе в данный момент кнопок.
Какие-то программы могут работать неправильно: не удалять уже нарисованные кнопки.
Была похожая проблема с программой @SS - скринсейвер


Top
   
PostPosted: Tue Sep 11, 2018 11:21 am 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4994
В общем, да, баг есть. Надо смотреть исходник BUTTONS и надо дебажить ядро.

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


Top
   
PostPosted: Tue Sep 11, 2018 1:37 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Добавил в button.inc вывод на доску отладки(DEBUGF) вот тут
Code:
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 wrote:
можно проделать с приложением calc
Попробовал, вывод на BOARD
Spoiler: Show
Attachment:
1.PNG
1.PNG [ 27.95 KiB | Viewed 890 times ]
При двойном щелчке на кнопки закрытия и сворачивания происходит максимизация окна(если оно sizable), при нажатии правой кнопкой мыши — сворачивание в заголовок, а минимизация и закрытие не работает.

Ещё вариант:
    Запустите BOARD
    Запустите Process manager(CPU)
    Наблюдайте постепенное увеличение количества кнопок на BOARD("Buttons = ")
Spoiler: Show
Attachment:
1.PNG
1.PNG [ 58.68 KiB | Viewed 890 times ]
Если кому интересно — вот моя сборка
Attachment:
kolibri.img.7z [1.23 MiB]
Downloaded 31 times


Top
   
PostPosted: Tue Sep 11, 2018 4:04 pm 
Offline

Joined: Sat Apr 22, 2017 6:11 pm
Posts: 222
Может заодно перенести код:
Code:
;---------------------------------------------------------------
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).

В обработке курсора мыши есть деактивация системных кнопок, всякое бывает - вдруг как-то срабатывает, повесь обработчик где-то здесь:
Code:
 ; 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

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

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


Top
   
PostPosted: Tue Sep 11, 2018 4:53 pm 
Offline

Joined: Sun Aug 09, 2015 3:41 pm
Posts: 109
theonlymirage wrote:
Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?

Code:
xor dx, dx
dec dx

или
Code:
mov dx, -1


Top
   
PostPosted: Tue Sep 11, 2018 6:26 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
theonlymirage wrote:
Может заодно перенести код:
Code:
;---------------------------------------------------------------
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 wrote:
Кстати, почему выбран id=0xffff для кнопки минимализации, если всего допустимо 4095 кнопок?
Одно с другим не связано. Это просто идентификатор и он не обязан быть меньше числа 4096. Вполне может быть равен, например, 8192 и более, если это удобно приложению.


Top
   
PostPosted: Tue Sep 11, 2018 6:54 pm 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 141
Quote:
Ещё вариант:
Запустите BOARD
Запустите Process manager(CPU)
Наблюдайте постепенное увеличение количества кнопок на BOARD("Buttons = ")


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


Top
   
PostPosted: Tue Sep 11, 2018 7:38 pm 
Offline

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

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

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


Top
   
PostPosted: Tue Sep 11, 2018 9:31 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4994
Pipes при каждом клике создавало все кнопки заново не удаляя старые и на 2 уровне примерно все кнопки отваливались. Cpu тоже нужно сделать чтобы старые кнопки удалялись.

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


Top
   
PostPosted: Tue Sep 11, 2018 10:44 pm 
Offline

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


Top
   
PostPosted: Wed Sep 12, 2018 12:04 am 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 4994
Проверьте в этой версии CPU проблема с дублирующимися кнопками исправлена?


Attachments:
cpu.kex [1.79 KiB]
Downloaded 24 times

_________________
Через тернии к звездам
Top
   
PostPosted: Wed Sep 12, 2018 12:09 am 
Offline

Joined: Sun Oct 27, 2013 8:13 pm
Posts: 141
Да, теперь нормально.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 25 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited