Page 28 of 77

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

Posted: Wed Jan 25, 2012 1:49 am
by Serge
Да. Обычно static переменные занимают безымянное место в сегменте .data

Posted: Sat Feb 04, 2012 7:58 pm
by 0CodErr
Вопрос про shared memory:
Если я сначала создам именованную память,
а потом в этом же потоке её опять открою,
то нужно два раза закрывать её?
Указатели же разные возвращаются.

Вопрос про OpenDialog:
В wiki я читал, конечно, но там не полное
описание. Собственно, хотелось бы узнать
описание того, чего там нет.

Я использовал его в своей программе, которая
делает скриншот. Так как, я не совсем разобрался,
я немного изменил пример из wiki и скомпилировал его.
Потом, при сохранении скриншота в файл, я из своей
программы запускаю этот изменённый скомпилированный пример.
Передаю ему в качестве параметра имя созданной shared memory,
и через неё программы общаются.

Ещё такой вопрос:
В эмуляторе на моём скриншоте иногда заметны артефакты
неперерисовавшегося окна(оно сворачивается, и потом делается скриншот).
Каким образом можно подождать, пока окно свернётся?

так выглядит моя программа:
Image

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

Posted: Sat Feb 04, 2012 8:37 pm
by Mario
Для OpenDialog не надо ничего руками делать. Давно уже все через библиотеку Proc_Lib сделано. Смотри программы которые используют OpenDialog.

Насчет именованной памяти как то сумбурно излагаешь. Если обращаешься по одному имени то и получаешь одну и ту же область. Может ли она быть дважды смонтирована по разным адресам я не знаю. Таких опытов не ставил. Лучше в вопросах приводить свои куски кода иначе малопонятно что подразумевалось.

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

Posted: Sat Feb 04, 2012 9:03 pm
by Serge
0CodErr
Да, надо закрывать два раза. Но если ты этого не сделаешь, ядро закроет всё само при завершении потока.

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

Posted: Sat Feb 04, 2012 9:13 pm
by Mario
Serge
Т.е. она два раза примонтируется по разным адресам?

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

Posted: Sun Feb 05, 2012 8:09 am
by Serge
Mario
Да. Физически это всё равно одна область памяти.

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

Posted: Thu Feb 09, 2012 6:12 pm
by 0CodErr
Mario
У меня проблема с фильтром OpenDialog.

Так не работает:
Filter dd Filter.end - Filter.1
.1:
db 'BMP',0
.end:
db 0

А так работает:
Filter dd Filter.end - Filter.1
.1:
db 'BMP',0
db 'BMP',0

.end:
db 0

В процессе работы программы
никаких действий с фильтром я не произвожу.
В чём может быть причина?

Ещё про мышь:

Получение данных прокрутки
с помощью функции 37.7 доступно только активному окну.
А если очень хочется, то как-нибудь можно их получить не
только активному окну? Я хочу, чтобы моя программка-информер(на скриншоте)
показывала и данные прокрутки.

Функция 37.7 возвращает и вертикальное, и горизонтальное смещение.
Но если мышь трёхкнопочная, тогда, получается, смещение может быть
только вертикальным, а горизонтальное неопределено?

Можно ли определить, какое количество кнопок у мыши?

А если мышь имеет больше 5-ти кнопок? Тогда нужен другой драйвер или как?

Image

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

Posted: Thu Feb 09, 2012 8:10 pm
by SoUrcerer
Хотет такую прогу для мышки. Её чуть-чуть допилить - и будет годный модуль для ПО настройки системы.

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

Posted: Thu Feb 09, 2012 10:35 pm
by Wildwest
Подробнее пиши, что за мышь, подключена к какому порту, используется ли переходник и т.п. CleverMouse пишет драйвер ЮСБ где-то в том форуме viewforum.php?f=30

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

Posted: Fri Feb 10, 2012 2:06 am
by Mario
0CodErr wrote:У меня проблема с фильтром OpenDialog.
Там есть фича небольшая/:
1) Когда фильтрации нет (т.е. в обоих случаях доступны все расширения файлов), то надо писать:
Spoiler:

Code: Select all

Filter:
dd	Filter.end - Filter.1
.1:
;db	'BIN',0
;db	'DAT',0
.end:
db	0
Заремленную часть естественно писать не обязательно. Кусок примера из программы Heed - hex редактор.

2) А вот когда фильтрация есть нужно писать:
Spoiler:

Code: Select all

Filter:
dd	Filter.end - Filter
.1:
db	'TXT',0
db	'ASM',0
db	'INC',0
db	'MAC',0
db	'DBG',0
db	'INI',0
db	'LOG',0
db	'DAT',0
db	'INF',0
db	'BAT',0
db	'SH',0

.end:
db	0
Кусок примера из программы Tinypad - текстовый редактор редактор.

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

Posted: Fri Feb 10, 2012 2:26 am
by Mario
0CodErr wrote: Получение данных прокрутки с помощью функции 37.7 доступно только активному окну. А если очень хочется, то как-нибудь можно их получить не
только активному окну? Я хочу, чтобы моя программка-информер(на скриншоте)
показывала и данные прокрутки.
Это не логично - ради одной программы менять логику всех остальных. Конечно правильно написанные программы фильтруют события мыши, если они не активны и специально не задумывалась обработка мыши в фоновом режиме. Однако это создаст дополнительную нагрузку на всю систему во время работы, если такое событие будет приходить ко всем приложениям. Небольшую нагрузку конечно, но все же.
Если так уж сильно необходимо, то нужно доделывать ядро, а этим заниматься некому кроме автора пожелания.
0CodErr wrote: Функция 37.7 возвращает и вертикальное, и горизонтальное смещение. Но если мышь трёхкнопочная, тогда, получается, смещение может быть
только вертикальным, а горизонтальное неопределено?
Нужно провести опыт - подключить мышь с одним скроллером и посмотреть. Оно либо будет дублировать данные, либо не будет выдавать ничего.
0CodErr wrote: Можно ли определить, какое количество кнопок у мыши?
Нет, функции возвращающей тип мыши не было предусмотрено. Ранее в этом не было необходимости. Более того поскольку несколько мышей могут работать параллельно (com1 + com2 + ps2), то получается нужно иметь функцию выводящую список всех подключенных мышей с их типами. Такой функционал в ядре требует дополнительного кода и доделывания всех драйверов мышей (com и ps2)
0CodErr wrote: А если мышь имеет больше 5-ти кнопок? Тогда нужен другой драйвер или как?
Текущий драйвер мыши ps2, не позволяет иметь более 5 кнопок и 2-х скроллеров. Если мышь слишком нестандартная и требует специальных драйверов, то естественно будет работать только базовый функционал: перемещение и две кнопки.

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

Posted: Sat Feb 18, 2012 8:29 pm
by 0CodErr
Вот, предположим, у потока есть дочерний поток.
В некоторый момент из родительского потока вызывается функция 18.18, чтобы
завершить дочерний поток. А дальше идёт ещё какой-нибудь код.
Так вот, может ли этот код начать выполняться до завершения дочернего потока?

Если окно не помещается на экране, то меняются ли его размеры и координаты,
или же оно только так рисуется, чтобы уместиться?

Как можно сделать, чтобы окно не реагировало на события мыши,
если над ним другое окно(либо частично перекрывается)?
Хотелось бы обрабатывать события даже если окно не активно.

Я хочу сделать панель для запуска программ.
Она читает список этих программ из файла(можно добавлять в него другие).
Image

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

Posted: Sat Feb 18, 2012 8:46 pm
by SoUrcerer
Замечательное дело делаешь. Только мое видение - вид панели должен быть настраиваемым.
Текущая панель меняет рабочую область экрана, кстати. Это может помочь.

По поводу 18.18:
Подфункция 18 - завершить процесс/поток по идентификатору.
Возвращаемое значение:
eax = 0 - успешно
eax = -1 - ошибка (процесс не найден или является системным)
Отсюда делаем вывод: не может.
Если не прав, ядерщики меня поправят.

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

Posted: Sat Feb 18, 2012 8:52 pm
by Serge
0CodErr
18.18 может. Функция гарантирует только что завершаемый поток не получит управления. Небольшая задержка поможет делу. Надо учитывать что в Колибри уничтожение любого потока и освобождение связанных с ним ресурсов происходит в контексте системного потока OS_IDLE и является отложенной операцией. Автоматически закрываются только привязанные к потоку ресурсы: расшареная память, курсоры и звуковые буферы. Память выделенная 68.12 не освобождается до завершения всех потоков приложения.

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

Posted: Sat Feb 18, 2012 9:15 pm
by Mario
Думается мне нужно сделать задержку 0,01 * 256 = 2,56 секунды, чтобы уж совсем надежно.