0CodErr
Если тебя интересует этот вопрос, то исходники ядра и OpenDialog открыты. У меня лично нет времени и желания изучать эту особенность работы.
Помогите новичку
-
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Посмотрел функцию открытия файлов, исправил небольшой глюк (ревизия 3366).0CodErr wrote:Вернусь к своему давнему сообщению viewtopic.php?f=2&t=684&p=43100#p43100
Ну вот давайте на примере t_edit:
...
Вопрос касался OpenDialog-а, выяснил что глюк возникает из-за попытки второй раз создать поток с окном OpenDialog.
Думаю что стоит сделать какую либо проверку на запуск окна с OpenDialog-ом в вызывающих программах. Возможно внести какой либо флаг активности окна в структуру OpenDialog_data и сделать так чтобы окно диалога в функции OpenDialog_Start устанавливало этот флаг, а при закрытии окна снимало флаг. Приложения использующие окна диалога могли бы в таком случае проверять этот флаг и если он установлен не вызывать повторный запуск окна OpenDialog.
Я может чего-то не понимаю, но какого лешего программа второй раз пытается создать OpenDialog? Зачем вообще второй поток? Я везде где прикручивал все делал в одном потоке, с наличием отрисовки draw_window, при наличии событии отрисовки, без обработки остальных событий. Т.е. есть поток основной программы и поток OpenDialog собственно. Что-то мне подсказывает что проблема совсем не в OpenDialog, а в том как с ним работают и лишние флаги не нужны. Если уж без лишних потоков совсем никак и душа жаждет, что мешает не обрабатывать другие события или пользоваться запретом событий в ф. 40? Какая религия запрещает?
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Вообще я сейчас понял, что спрашивалось в исходном посте viewtopic.php?f=2&t=684&p=43100#p43100
Происходит такой эффект потому, что код вызывающий OpenDialog в любой доступный момент стремится сделать вызванный OpenDialog выше себя в оконном стеке. Почему сигнал сворачивания переходит между потоками, хотя не должен - это уже проблема совсем не в OpenDialog, а в нечетко срабатывающем коде ядра. Если у кого есть желание - разбирайтесь с проблемой, опять же мне лень и нет времени.
Происходит такой эффект потому, что код вызывающий OpenDialog в любой доступный момент стремится сделать вызванный OpenDialog выше себя в оконном стеке. Почему сигнал сворачивания переходит между потоками, хотя не должен - это уже проблема совсем не в OpenDialog, а в нечетко срабатывающем коде ядра. Если у кого есть желание - разбирайтесь с проблемой, опять же мне лень и нет времени.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Со вторым открытием окна я ошибся, главное окно заблокировано пока открыт диалог. Потому даже при повторном нажатии на кнопку открытия в вызвавшей программе ничего срабатывать не должно. Флагов никаких в диалоговое окно вводить не нужно.
Нажатие кнопки происходит уже после того, как кнопка мыши отпущена, так?
Тогда предположу, как это происходит:
Когда мы нажимаем мышью на кнопку родительского окна, то активен родительский поток.
Но тут же становится активным OpenDialog, а мы ещё не отпустили кнопку мыши.
Теперь, когда мы её отпустим, произойдёт событие нажатия кнопки, но оно отправится активному потоку OpenDialog.
Тогда предположу, как это происходит:
Когда мы нажимаем мышью на кнопку родительского окна, то активен родительский поток.
Но тут же становится активным OpenDialog, а мы ещё не отпустили кнопку мыши.
Теперь, когда мы её отпустим, произойдёт событие нажатия кнопки, но оно отправится активному потоку OpenDialog.
Я вообще-то тоже самое и сказал. Код ядра отрабатывает нечетко. Должна проходить проверка на координаты хотя бы, для второго события. В типичном случае она есть для обычных кнопок созданных программой, а тут не срабатывает, так как сворачивание окна это такой хак в ядерном коде в обход программы.0CodErr wrote:Нажатие кнопки происходит уже после того, как кнопка мыши отпущена, так?
Тогда предположу, как это происходит:
Когда мы нажимаем мышью на кнопку родительского окна, то активен родительский поток.
Но тут же становится активным OpenDialog, а мы ещё не отпустили кнопку мыши.
Теперь, когда мы её отпустим, произойдёт событие нажатия кнопки, но оно отправится активному потоку OpenDialog.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Для потоков лучше статическая переменная стека или malloc?
Из хаоса в космос
Вопрос не понятен. Зависит от объёма данных, если данных не много, то лучше вообще на регистрах всё посчитать.Leency wrote:Для потоков лучше статическая переменная стека или malloc?
Потоку требуется свой стек. Как его лучше выделить - заранее выделить, или malloc? Или по барабану?
Для одного потока статически. Если поток использует alloca и размер тяжело рассчитать заранее, лучше выделить с запасом через 68.12. И обязательно выравнивать на 16 байт если есть вероятность использования SSE. По этой причине malloc как раз и не подходит.
Под malloc и имелась в виду 68.12; потому что через malloc из libc, использующий sbrk, как-то стрёмно 
Есть у меня в коде очень злополучное место сделанное через "n-ое место в ^ 2"!!! Помогите оптимизировать эту гадость)
Функция разбора параметров!
Функция разбора параметров!
Code: Select all
_read_params:
mov al,[params+2]
mov [params_c+0],al
mov al,[params+3]
mov [params_c+1],al
mov al,[params+4]
mov [params_c+2],al
mov al,[params+5]
mov [params_c+3],al
mov al,[params+6]
mov [params_c+4],al
mov al,[params+7]
mov [params_c+5],al
mov al,[params+8]
mov [params_c+6],al
mov al,[params+9]
mov [params_c+7],al
mov esi,params_c
mov ecx,16
call ascii2int
mov [color],eax
mov al,[params+11]
mov [params_c+0],al
mov al,[params+12]
mov [params_c+1],al
mov al,[params+13]
mov [params_c+2],al
mov al,[params+14]
mov [params_c+3],al
mov al,[params+15]
mov [params_c+4],al
mov al,[params+16]
mov [params_c+5],al
mov al,[params+17]
mov [params_c+6],al
mov al,[params+18]
mov [params_c+7],al
mov esi,params_c
mov ecx,16
call ascii2int
mov [color2],eax
ret
;.....
;ascii2int - Преобразование строки в число
; esi - указатель на нультерминированную строку
; ecx - основание системы счисления
; Возвращает eax - число
;.....
color dd 00000000h ; хранит значение выбранного цвета
color2 dd 00FFFFFFh ; хранит значение второго выбранного цвета
params db 20 dup(0) ; приём параметров
params_c db 9 dup(0) ; приёмник для цвета
Тупая оптимизация по размеру, без лишнего напряга извилин:
Читаем "Юров В.И. Assembler. Учебник для ВУЗов" - один из самых доступных в плане понимания ассемблера учебник. Гуглится, скачивается.
З.Ы. При других размерах данных можно использовать movsw и movsd.
З.З.Ы Для более хитрой оптимизации нужно разбираться со входными и выходными данными.
Code: Select all
mov esi,адрес_источника
mov edi,адрес_приемника
mov ecx,количество_повторов
cld
rep movsbЗ.Ы. При других размерах данных можно использовать movsw и movsd.
З.З.Ы Для более хитрой оптимизации нужно разбираться со входными и выходными данными.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
In english: flat assemblers manual - string operations
"Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -- and a lot of courage -- to move in the opposite direction." Albert Einstein
Who is online
Users browsing this forum: No registered users and 3 guests