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

Applications development, KoOS API questions
  • 0CodErr wrote:Вернусь к своему давнему сообщению viewtopic.php?f=2&t=684&p=43100#p43100
    Ну вот давайте на примере t_edit:
    ...
    Посмотрел функцию открытия файлов, исправил небольшой глюк (ревизия 3366).
    Вопрос касался 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, а в нечетко срабатывающем коде ядра. Если у кого есть желание - разбирайтесь с проблемой, опять же мне лень и нет времени.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Со вторым открытием окна я ошибся, главное окно заблокировано пока открыт диалог. Потому даже при повторном нажатии на кнопку открытия в вызвавшей программе ничего срабатывать не должно. Флагов никаких в диалоговое окно вводить не нужно.
  • Нажатие кнопки происходит уже после того, как кнопка мыши отпущена, так?
    Тогда предположу, как это происходит:
    Когда мы нажимаем мышью на кнопку родительского окна, то активен родительский поток.
    Но тут же становится активным 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)              ; приёмник для цвета
    
  • Тупая оптимизация по размеру, без лишнего напряга извилин:

    Code: Select all

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