Page 48 of 77

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

Posted: Tue Mar 12, 2013 2:03 pm
by Mario_r4
0CodErr
Если тебя интересует этот вопрос, то исходники ядра и OpenDialog открыты. У меня лично нет времени и желания изучать эту особенность работы.

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

Posted: Tue Mar 12, 2013 4:16 pm
by IgorA
0CodErr wrote:Вернусь к своему давнему сообщению viewtopic.php?f=2&t=684&p=43100#p43100
Ну вот давайте на примере t_edit:
...
Посмотрел функцию открытия файлов, исправил небольшой глюк (ревизия 3366).
Вопрос касался OpenDialog-а, выяснил что глюк возникает из-за попытки второй раз создать поток с окном OpenDialog.
Думаю что стоит сделать какую либо проверку на запуск окна с OpenDialog-ом в вызывающих программах. Возможно внести какой либо флаг активности окна в структуру OpenDialog_data и сделать так чтобы окно диалога в функции OpenDialog_Start устанавливало этот флаг, а при закрытии окна снимало флаг. Приложения использующие окна диалога могли бы в таком случае проверять этот флаг и если он установлен не вызывать повторный запуск окна OpenDialog.

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

Posted: Tue Mar 12, 2013 8:23 pm
by Mario_r4
Я может чего-то не понимаю, но какого лешего программа второй раз пытается создать OpenDialog? Зачем вообще второй поток? Я везде где прикручивал все делал в одном потоке, с наличием отрисовки draw_window, при наличии событии отрисовки, без обработки остальных событий. Т.е. есть поток основной программы и поток OpenDialog собственно. Что-то мне подсказывает что проблема совсем не в OpenDialog, а в том как с ним работают и лишние флаги не нужны. Если уж без лишних потоков совсем никак и душа жаждет, что мешает не обрабатывать другие события или пользоваться запретом событий в ф. 40? Какая религия запрещает?

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

Posted: Tue Mar 12, 2013 8:40 pm
by Mario_r4
Вообще я сейчас понял, что спрашивалось в исходном посте viewtopic.php?f=2&t=684&p=43100#p43100
Происходит такой эффект потому, что код вызывающий OpenDialog в любой доступный момент стремится сделать вызванный OpenDialog выше себя в оконном стеке. Почему сигнал сворачивания переходит между потоками, хотя не должен - это уже проблема совсем не в OpenDialog, а в нечетко срабатывающем коде ядра. Если у кого есть желание - разбирайтесь с проблемой, опять же мне лень и нет времени.

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

Posted: Tue Mar 12, 2013 9:53 pm
by IgorA
Со вторым открытием окна я ошибся, главное окно заблокировано пока открыт диалог. Потому даже при повторном нажатии на кнопку открытия в вызвавшей программе ничего срабатывать не должно. Флагов никаких в диалоговое окно вводить не нужно.

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

Posted: Tue Mar 12, 2013 10:48 pm
by 0CodErr
Нажатие кнопки происходит уже после того, как кнопка мыши отпущена, так?
Тогда предположу, как это происходит:
Когда мы нажимаем мышью на кнопку родительского окна, то активен родительский поток.
Но тут же становится активным OpenDialog, а мы ещё не отпустили кнопку мыши.
Теперь, когда мы её отпустим, произойдёт событие нажатия кнопки, но оно отправится активному потоку OpenDialog.

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

Posted: Tue Mar 12, 2013 11:00 pm
by Mario_r4
0CodErr wrote:Нажатие кнопки происходит уже после того, как кнопка мыши отпущена, так?
Тогда предположу, как это происходит:
Когда мы нажимаем мышью на кнопку родительского окна, то активен родительский поток.
Но тут же становится активным OpenDialog, а мы ещё не отпустили кнопку мыши.
Теперь, когда мы её отпустим, произойдёт событие нажатия кнопки, но оно отправится активному потоку OpenDialog.
Я вообще-то тоже самое и сказал. Код ядра отрабатывает нечетко. Должна проходить проверка на координаты хотя бы, для второго события. В типичном случае она есть для обычных кнопок созданных программой, а тут не срабатывает, так как сворачивание окна это такой хак в ядерном коде в обход программы.

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

Posted: Wed Mar 13, 2013 4:53 pm
by Leency
Для потоков лучше статическая переменная стека или malloc?

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

Posted: Sun Mar 17, 2013 9:18 pm
by Asper
Leency wrote:Для потоков лучше статическая переменная стека или malloc?
Вопрос не понятен. Зависит от объёма данных, если данных не много, то лучше вообще на регистрах всё посчитать.

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

Posted: Sun Mar 17, 2013 10:11 pm
by SoUrcerer
Потоку требуется свой стек. Как его лучше выделить - заранее выделить, или malloc? Или по барабану?

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

Posted: Sun Mar 17, 2013 10:27 pm
by Serge
Для одного потока статически. Если поток использует alloca и размер тяжело рассчитать заранее, лучше выделить с запасом через 68.12. И обязательно выравнивать на 16 байт если есть вероятность использования SSE. По этой причине malloc как раз и не подходит.

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

Posted: Mon Mar 18, 2013 9:55 am
by SoUrcerer
Под malloc и имелась в виду 68.12; потому что через malloc из libc, использующий sbrk, как-то стрёмно :)

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

Posted: Mon Mar 18, 2013 1:45 pm
by Akyltist
Есть у меня в коде очень злополучное место сделанное через "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)              ; приёмник для цвета

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

Posted: Mon Mar 18, 2013 1:54 pm
by Mario_r4
Тупая оптимизация по размеру, без лишнего напряга извилин:

Code: Select all

mov esi,адрес_источника
mov edi,адрес_приемника
mov ecx,количество_повторов
cld
rep movsb
Читаем "Юров В.И. Assembler. Учебник для ВУЗов" - один из самых доступных в плане понимания ассемблера учебник. Гуглится, скачивается.
З.Ы. При других размерах данных можно использовать movsw и movsd.
З.З.Ы Для более хитрой оптимизации нужно разбираться со входными и выходными данными.

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

Posted: Mon Mar 18, 2013 2:04 pm
by hidnplayr