Проблемы с изучением прогресс бара.

Тема в разделе "WASM.WIN32", создана пользователем Plis, 18 сен 2009.

  1. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Доброго времени!

    Есть проблема с изучением прогресс бара.
    Iczelion progressbar : http://www.wasm.ru/article.php?article=1001018 ( 18 урок - контролы )
    Как работает пример в уроке с SetTimer я разобрался, но как привязывать к коду в программе не могу.

    Пример:

    ThreadProc PROC USES ecx Param:lol: WORD

    mov edx, 6000000
    mov ecx, 60000000

    cikl:

    add eax,eax
    dec ecx
    cmp ecx,0
    je vikh
    cmp edx,ecx
    jne cikl
    invoke SendMessage, hwndProgres, PBM_STEPIT, 0, 0
    shr edx,16
    jmp cikl

    vikh:

    invoke SendMessage,hwndProgres, PBM_SETPOS,0,0

    ret

    ThreadProc endp

    в трейде просто складываю eax c eax и хочу что бы этот процесс сопровождался заполнением процесс бара.
    Суть идеи: когда уменьшающаяся ecx догоняет edx, то происходит сообщение на PBM_SETPOS, которое сдвигает прогресс бар на какое-то количество пунктов. Потом edx делится, что бы ecx опять его догоняла, ну и так далее...

    В основном коде установки прогресс бара такие:

    S_VISIBLE+WS_CHILD, 0, 243, 400, 15, hWnd, IDC_PROGRES, hInstance, NULL
    mov hwndProgres,eax
    mov eax,1000
    mov CurrentStep, eax
    shl eax,16
    invoke SendMessage, hwndProgres,PBM_SETRANGE,0,eax
    invoke SendMessage, hwndProgres,PBM_SETSTEP,1,0

    Прогресс бар зацикливается и всё...
    PBM_SETSTEP и PBM_SETRANGE пробовал менять на разные значения, результат тот же.

    Гугл прошарил , везде PBM_SETSTEP и PBM_SETRANGE применяется только с SetTimer, но к своему примеру не знаю как это прикрутить. Если не сложно объясните
    Заранее спасибо!

    p.s. Задал вопрос здесь: http://www.wasm.ru/forum/viewtopic.php?pid=340267#p340267
    Ответил или прикололся Rockphorr я не понял, но хотелось бы ещё и получить информацию по прогресс бару.
    Неверный результат - тоже результат...
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Plis
    Глянь там в аттаче прогрессбар прикручен к процессу обработки файла
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    В качестве счетчиков и места для хранения переменных Plis использует регистры eax, edx, ecx при этом вызывается SendMessage который использует эти регистры, естественно, "Прогресс бар зацикливается и всё..." отсюда мораль, 1) либо перед вызывом SendMessage сохранять значение eax, edx, ecx в стеке, а после SendMessage извлекать их оттуда, 2) либо использовать переменные в памяти, 3) либо использовать содержимое edi, esi, ebp, ebx значение в которых api-функции не портят
     
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    В аттаче иммитация прогрессбара в консольном приложении и работа с пятью разными прогрессбарами через WM_TIMER. Написано на masm и nasm, exe и sours прилагаются
     
  5. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Plis
    Выложил там переделку примера из tut18 именно по вашему сценарию (со 2-ым потоком), чтобы вы могли сравнить с вашим "зацикливанием".
     
  6. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Mikl___
    Да, спосибо, установил переменные вместо eax и ecx - перестала зацикливаться... простая ошибка...

    Исчерпывающий пример!!!

    kero
    Да, спасибо, в примере esi и edi используются для цикла, о чём и написал Mikl___.

    Что за переходы :

    jz @f
    jnz @b

    т.е. я понимаю что они переходят к одной метке @@ и к другой, понимаю и зачем это делается - а вот почему это работает? Можно ведь так и обозначить метки @f и @b, или в твоём примере есть какое-то преимущество?
     
  7. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Y_Mur
    Тоже спасибо за ответ.
    kero без таймера уже мне расписал, да, в принципе и так всё понятно...
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    jz @f
    jnz @b

    т.е. я понимаю что они переходят к одной метке @@ и к другой, понимаю и зачем это делается - а вот почему это работает? Можно ведь так и обозначить метки @f и @b, или в твоём примере есть какое-то преимущество?

    это стандартный макро механизм генерации имен чтоб лишний раз не напрягать фантазию по поводу имен меток
     
  9. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Rockphorr
    А буквы только f и b используются или другие есть?
    Если только эти, то получается можно использовать таким способом только две метки...
     
  10. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Plis
    на все вопросы ответит справочник в составе масм 6.11
     
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    буква f (forvard) jmp @f -- переход вперед к ближайшей @@ метке; буква b (back) jmp @b -- переход назад к ближайшей @@ метке, какие еще можно подставить буквы? :)
     
  12. Plis

    Plis New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    26
    Mikl___
    Переход к ближайшему пивному ларьку... :)