Page 29 of 77

Re: Помогите новичку

Posted: Sat Feb 18, 2012 9:21 pm
by Serge
Лучший вариант не задержка, а вызов 68.1 ака yield(). Планировщик отработает все остальные потоки и OS_IDLE, который уничтожит поток. Но это только в том случае если надо дождаться гарантированного освобождения ресурсов из очень маленького списка.
Практической необходимости в этом в 99.(9)% случаев я не вижу.

Re: Помогите новичку

Posted: Sat Feb 18, 2012 9:23 pm
by Mario
0CodErr wrote:Если окно не помещается на экране, то меняются ли его размеры и координаты,
или же оно только так рисуется, чтобы уместиться?
Размеры большого окна корректируются до размеров текущего видеорежима. Если выводится маленькое окно, но его тело вылазит за пределы физических координат, то корректируются начальные координаты такого окна.
0CodErr wrote: Как можно сделать, чтобы окно не реагировало на события мыши,
если над ним другое окно(либо частично перекрывается)?
Если окно отслеживает является ли оно верхним в оконном стеке, то при нормально реализованной логике окно не должно реагировать на события мыши, когда оно не вверху.
Если подразумевается режим "Stay On Top" (например, как в Виндовс), то такой функциональности в ядре не предусмотрено.
0CodErr wrote: Хотелось бы обрабатывать события даже если окно не активно.
Непонятно какие события.

Posted: Sun Feb 19, 2012 2:42 pm
by 0CodErr
SoUrcerer wrote:Текущая панель меняет рабочую область экрана, кстати. Это может помочь.
Я бы не хотел так делать. Может так получиться, что моя панель будет не на всю ширину экрана, и тогда останется никогда неиспользуемое пространство. Это неправильно, я считаю.
SoUrcerer wrote:...вид панели должен быть настраиваемым.
Она в определённой степени настраивается: можно менять цвета, высоту, количество запускаемых программ, параметры командной строки для них, иконки к программам.
Serge wrote:Память выделенная 68.12 не освобождается до завершения всех потоков приложения.
Я хотел уточнить: здесь, ведь, не играет роли как именно поток завершён(насильственно или самостоятельно)?
Mario wrote:Думается мне нужно сделать задержку 0,01 * 256 = 2,56 секунды, чтобы уж совсем надежно.
256 - это максимальное число потоков в системе? Тогда, если в будущем их будет больше, надо корректировать это значение. Наверное, всё-таки 68.1 подойдёт лучше.
Mario wrote:
0CodErr wrote:Хотелось бы обрабатывать события даже если окно не активно.
Непонятно какие события.
События мыши.
Mario wrote: Если окно отслеживает является ли оно верхним в оконном стеке, то при нормально реализованной логике окно не должно реагировать на события мыши, когда оно не вверху.
Если подразумевается режим "Stay On Top" (например, как в Виндовс), то такой функциональности в ядре не предусмотрено.
Нет, не "Stay On Top". Я бы вот как хотел:
если над моим окном какое-то другое, но закрывает его не полностью, то
в незакрытой области моё окно должно реагировать на события мыши(а в закрытой не должно).

Re:

Posted: Sun Feb 19, 2012 3:19 pm
by Mario
0CodErr wrote: если над моим окном какое-то другое, но закрывает его не полностью, то
в незакрытой области моё окно должно реагировать на события мыши(а в закрытой не должно).
События мыши все же отличаются по функциональности, например клик по области приложения однозначно приведет к его "активации", т.е. оно станет самым верхним в оконном стеке. Другое дело если подразумевается прокрутка скроллом или просто отслеживание координат. Можно сделать функции возвращающую из область оконного стека текущее значение для точки, которая находится под вершиной указателя мыши. Проверяя это значение узнать перекрыта ли данная точка окна точкой другого вышележащего окна. Возможно кто то предложит более выигрышную стратегию для реализации, но я такой не вижу пока.

Re: Помогите новичку

Posted: Sun Feb 19, 2012 3:33 pm
by Serge
0CodErr wrote:Я хотел уточнить: здесь, ведь, не играет роли как именно поток завершён(насильственно или самостоятельно)?
Абсолютно никакой.

Re: Помогите новичку

Posted: Mon Mar 19, 2012 4:46 pm
by IgorA
Как можно установить координату "горячей точки" курсора? Смотрел функцию 37.5 (установить курсор), в ней этого параметра нет.

Re: Помогите новичку

Posted: Mon Mar 19, 2012 4:58 pm
by Mario
Горячая точка устанавливается до активации курсора функцией 37.5, т.е. при загрузке курсора по 37.4. Смотри описание.

Re: Помогите новичку

Posted: Mon Mar 19, 2012 5:49 pm
by IgorA
Пока не работает 37.4, горячая точка получается в левом верхнем углу, хотя задал координату 16,16.

Code: Select all

mov edx,(16 shl 8)+16
shl edx,16
mov dx,2 ;LOAD_INDIRECT
Вроди должно быть по центру, если весь размер 32*32. Буду разбиратся что не так, если не получится буду рисовать кривые курсоры.

Re: Помогите новичку

Posted: Mon Mar 19, 2012 6:30 pm
by Mario
Может баг в ядре, а может ты что то не так делаешь - надо разбираться и смотреть код.

Re: Помогите новичку

Posted: Tue Mar 20, 2012 12:45 am
by Mario
IgorA
Никакого криминала в ядре я не нашел. Мне нужен твой код для просмотра - скинь в личку, если тебе нужна помощь.

Re: Помогите новичку

Posted: Tue Mar 20, 2012 1:54 am
by IgorA
Я уже успел сделать ревизию 2482, в которой был мой код с курсорами. Есть файл (root)/programs/media/log_el/trunk/log_el.asm , в котором есть функция:

Code: Select all

1984	proc set_pen_mode uses eax ebx ecx edx, mode:dword, icon:dword
там я изменил строки 1989-1990:

Code: Select all

1989	                ;mov edx,((cx shl 8) + cy) shl 16
1990	                mov edx,2 ;LOAD_INDIRECT
Раньше было так:

Code: Select all

mov edx,((16 shl 8) + 16) shl 16
mov dx,2 ;LOAD_INDIRECT
И при выборе карандаша (желательно синего) рисование всеравно происходит с левого верхнего угла курсора. Красный карандаш для тестирования лучше не брать, т. к. в нем я сделал выравнивание линий на первую прорисованую точку (что-бы провода не рисовались кривыми).

Re: Помогите новичку

Posted: Tue Mar 20, 2012 6:02 pm
by Mario
Исправил в SVN r. 2483

Тот кто делал этот код в ядре, явно поленился проверить работоспособность реализации в этом конкретном случае. Впрочем не будем кидаться камнями - сами не без греха.

Re: Помогите новичку

Posted: Fri Apr 27, 2012 3:01 pm
by Scampada
Здравствуйте, бона таго... Не уверен, что пишу туда, куда стоит, нотакой общий вопрос: как обстоят дела в КОС с базами данных? С работой с ними, то есть.

Re: Помогите новичку

Posted: Fri Apr 27, 2012 5:50 pm
by Nable
to Scampada
Примерно так: viewtopic.php?f=24&t=1163

Re: Помогите новичку

Posted: Sat Apr 28, 2012 7:22 pm
by Scampada
Еще такой вопрос, думаю, лучше всего сюда.
Допустим, есть у меня массив данных:

; массив 5х5 в одномерном представлении
c0 db 0
c1 db 0
c2 db 0
c3 db 0
c4 db 0
...
c24 db 0
c_end db 'eoa' ;end of array


Могу я обрабатывать массив подобным образом:

mov ax,c0 ;помещаем _адрес_ данных в ах

do_smth_with_array:
cmp ax,c_end ;сравниваем адрес, содержащийся в ах, с адресом переменной, символизирующей конец массива
jae _break ;если содержимое ах большеравно адреса конца массива, то выходим из цикла
mov [ax],1
mov ax,ax+1
jmp do_smth_with_array

_break:
int 20h


Я мог ошибиться в строке "mov ax,ax+1", потому что не знаю точно, что нужно прибавлять, единицу или что-то другое, например, 8. ;) Но общий смысл понятен - так вот будет ли это работать? =?
Знаю, можно попробовать и посмотреть :mrgreen: но здесь мне могут и ответить, что и почему может не работать :roll: