Сколько осталось времени до загрузки?

Тема в разделе "WASM.NETWORKS", создана пользователем dgs, 15 янв 2009.

  1. dgs

    dgs New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2008
    Сообщения:
    434
    Привет всем, собственно проблема состоит в том, что время до окончания загрузки файла из интернета определяется не верно... Помогите пожалуйста, ошибка кажется в FPU, но где?...

    Код (Text):
    1.   wmtimer:
    2.         mov     eax, [thread]
    3.         test    eax, eax
    4.         je      finish
    5.  
    6.         ; устанавливаем прогресс в контроле
    7.  
    8.         invoke  GetFileSize,[hfile],0
    9.         mov     [divider], 1024
    10.         mov     [hmem], eax
    11.         stdcall Division, [hmem]
    12.         mov     [hmem], eax
    13.         invoke  SendMessage,[hprogress],PBM_SETPOS,[hmem],0
    14.         cinvoke wsprintf, string_buffer, message.status,[hmem]
    15.         invoke  SetWindowText,[hlabel],string_buffer
    16.  
    17.         .if [dwCount] = 0
    18.  
    19.         ; считаем оставшееся время каждые 10 с
    20.  
    21.         invoke  GetFileSize,[hfile],0         ; узнаем размер файла на диске
    22.         mov     ecx, [file_size]
    23.         sub     ecx, eax         ; узнаем сколько осталось загрузить
    24.         mov     edx, [ticks]         ; размер файла 10 с назад
    25.         mov     eax, [hmem]          ; текущий размер файла
    26.  
    27.         try         ; макрос установки SEH
    28.  
    29.         mov     [divider], 1024
    30.         finit
    31.         fild    dword[divider]
    32.         fild    dword[eax]
    33.         fmul    st0, st1
    34.         fist    dword[eax]
    35.         fild    dword[divider]
    36.         fild    dword[edx]
    37.         fmul    st0, st1
    38.         fist    dword[edx]
    39.         ffree   st0
    40.         ffree   st1
    41.  
    42.         except
    43.         endt
    44.  
    45.         sub     eax, edx
    46.      ;   mov     [divider], 10
    47.      ;   stdcall Division, eax
    48.  
    49.      ;   mov     [divider], eax
    50.      ;   stdcall Division, ecx
    51.       ;  mov     [divider], 60
    52.       ;  stdcall Division, eax
    53.         cinvoke wsprintf,string_buffer,message.delay,eax
    54.         stdcall WriteListView,colum.load,string_buffer
    55.  
    56.         ; Считаем скорость
    57.  
    58.         mov     ecx, [ticks]
    59.         mov     eax, [hmem]
    60.         mov     [ticks], eax
    61.         sub     eax, ecx
    62.         mov     [divider], 10
    63.         stdcall Division, eax
    64.         cinvoke wsprintf,string_buffer,message.time ,eax
    65.         stdcall WriteListView,colum.load,string_buffer
    66.         mov     [dwCount], 10
    67.         .else
    68.         dec     [dwCount]
    69.         .endif
    70.         jmp     finish
    71.  
    72.         finit
    73.       get_load_time_part:
    74.         mov     eax, [ticks]
    75.         mov     [divider], eax
    76.         fild    dword[divider]
    77.         fild    dword[len_buf]
    78.         fmul    st0, st1
    79.         fist    dword[hmem]
    80.       get_remained_file:
    81.         mov     [divider], 1000
    82.         fild    dword[divider]
    83.         fild    dword[hmem]
    84.         fdiv    st0, st1
    85.         frndint
    86.         fist    dword[divider]
    87.         mov     eax, [divider]
    88.         cmp     eax, 0
    89.         jle     test_read_result
    90.         cinvoke wsprintf,string_buffer,message.time ,eax
    91.         stdcall WriteListView,colum.load,string_buffer
    92.         xor     eax, eax
    93.         mov     [hmem], eax
    94.         mov     [divider], eax
    95.         jmp     finish
    Функция Division:
    Код (Text):
    1. ...
    2. divider dd ?
    3. ...
    4. proc Division Integer
    5.  
    6.         finit
    7.         fild    dword[divider]
    8.         fild    dword[Integer]
    9.         fdiv    st0, st1          
    10.         frndint                  
    11.         fist    dword[divider]
    12.         ffree   st0
    13.         ffree   st1
    14.         mov     eax, [divider]
    15.         ret
    16. endp