Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2012, 17:40   #1
Kaaatso
Новичок
Джуниор
 
Регистрация: 12.05.2012
Сообщений: 1
Вопрос Пример работы с потоками, не могу разобраться!

День добрый, помогите разобрать код программы буду очень благодарен
Код:
.386P
.MODEL FLAT, STDCALL
include pr64_1.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\gdi32.lib
;------------------------------------------------
_DATA SEGMENT DWORD PUBLIC USE32 'DATA'
     MSG        MSGSTRUCT <?>
     HINST      DD 0 
     PA         DB "DIAL1",0
     TIM        DB  "Дата  %u/%u/%u  Время  %u:%u:%u",0
     STRCOPY    DB  50   DUP(?)
     DATA       DAT <0>
     HTHR       DD   ?
_DATA ENDS 
_TEXT SEGMENT DWORD PUBLIC USE32 'CODE'
START: 
     PUSH  0
     CALL  GetModuleHandleA@4
     MOV   [HINST], EAX
;-------------------------------------
     PUSH  0
     PUSH  OFFSET WNDPROC
     PUSH  0
     PUSH  OFFSET PA
     PUSH  [HINST] 
     CALL  DialogBoxParamA@20 
     CMP   EAX,-1 
     JNE   KOL 
KOL:
;-------------------------------------
     PUSH  0
     CALL  ExitProcess@4
;-------------------------------------
;-------------------------------------
WNDPROC PROC
        PUSH EBP
        MOV  EBP, ESP
        PUSH EBX
        PUSH ESI
        PUSH EDI
;-------------------------------------
        CMP  DWORD PTR [EBP+0CH],WM_CLOSE
        JNE  L1
L3: 
        PUSH 0
        PUSH HTHR
        CALL TerminateThread@8 
        PUSH 0
        PUSH DWORD PTR [EBP+08H]
        CALL EndDialog@8
        JMP  FINISH 
L1:
        CMP  DWORD PTR [EBP+0CH],WM_INITDIALOG
        JNE  L2
        PUSH 1
        PUSH DWORD PTR [EBP+08H]
        CALL GetDlgItem@8 
        PUSH OFFSET HTHR  
        PUSH 0
        PUSH EAX     
        PUSH OFFSET GETTIME 
        PUSH 0
        PUSH 0
        CALL CreateThread@24 
        JMP  FINISH 
L2:
        CMP  DWORD PTR [EBP+0CH],WM_COMMAND
        JNE  FINISH 
        CMP  WORD PTR [EBP+10H],2
        JE   L3  
FINISH:
        POP  EDI
        POP  ESI
        POP  EBX
        POP  EBP
        MOV  EAX,0
        RET  16
WNDPROC ENDP
;-------------------------------------
GETTIME PROC
        PUSH EBP
        MOV  EBP,ESP 
L0: 
        PUSH 1000
        CALL Sleep@4 
        PUSH OFFSET DATA
        CALL GetLocalTime@4 
        MOVZX EAX,DATA.sec
        PUSH EAX
        MOVZX EAX,DATA.min 
        PUSH EAX
        MOVZX EAX,DATA.hour
        PUSH EAX
        MOVZX EAX,DATA.year
        PUSH EAX
        MOVZX EAX,DATA.month
        PUSH EAX
        MOVZX EAX,DATA.day
        PUSH EAX
        PUSH OFFSET TIM
        PUSH OFFSET STRCOPY
        CALL wsprintfA 
        PUSH OFFSET STRCOPY
        PUSH 0
        PUSH WM_SETTEXT
        PUSH DWORD PTR [EBP+08H]
        CALL SendMessageA@16
        JMP  L0 
        POP  EBP
        RET  4
GETTIME ENDP 
_TEXT   ENDS    
        END START

Последний раз редактировалось Stilet; 27.05.2012 в 10:43.
Kaaatso вне форума Ответить с цитированием
Старый 27.05.2012, 07:36   #2
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Имеется некоторый диалог с именем "DIAL1".
На диалоге есть кнопка выхода (итем номер 2, строка 71 кода).
На диалоге есть видимо текстовый лейбл (или едит-контрол) (итем номер 1,строчка 57)
Создаем модальный диалог с помощью CALL DialogBoxParamA@20 в строчке 28 с процедурой WNDPROC.
Виндовая процедура диалога в начале получает сообщение WM_INITDIALOG (строка 55) и в ответ создает поток с поточной функцией GETTIME. При этом, в качестве параметра, поточной функции передаётся хэндл лейбла (или текстового контрола) (строки 59 и 62).
При нажатии кнопки выхода (строка 69, метка L2), завершается поток (строка 49) и сам диалог (строка 52).
Что делает поток? Процедура GETTIME засыпает на 1 секунду (строка 87), далее получает локальное время (строка 89) и форматирует его функцией wsprintf (строка 104). После чего, красиво отфармаченое время отображется как текст в лейбле с помощью посыла сообщения WM_SETTEXT (строки 105-109).
rlib вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритм работы приложение с потоками fate Общие вопросы Delphi 6 16.05.2011 10:23
НЕ МОГУ РАЗОБРАТЬСЯ С ПОТОКАМИ Psix0 Общие вопросы C/C++ 5 22.01.2011 18:21
Пример работы с TThread Shouldercannon Общие вопросы Delphi 2 12.07.2010 16:47
Не могу разобраться с позиционированием изображений (пример внутри) css-novi4ok HTML и CSS 2 07.04.2010 13:32