Отображение на экране полученных данных

Тема в разделе "WASM.WIN32", создана пользователем Meatcoins, 26 янв 2008.

  1. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Короче, сделал устройство, которое по Bluetooth передаёю данные в комп с частотой 500 Гц. Использую стандартный Bluetooth-адаптер для компа DBT-122. С помощью его драйверов эмулируется виртуальный COM4 - порт, когда передача идёт по SPP-профилю, как в моём случае. Всё работает, всё отлично! Но экран моргает и процессор перегружен.
    Тут код этой функции, которая осуществляет вывод на экран:
    Код (Text):
    1. .data
    2. lpBuffer db "B",0h
    3. lpBuffer2 db 0h,0h
    4. dFlag dd ?
    5. hCom dd ?
    6. hFile_data dd ?
    7.  
    8. hFile_data2 dd ?
    9.  
    10. hEvent dd ?
    11. nNumberOfBytesToWrite dd ?
    12. lpNumberOfBytesWritten dd ?
    13. lpOverlapped OVERLAPPED <?>
    14. lpThreadId dd ?
    15. lpThreadHandle dd ?
    16. dExitCode dd ?
    17. .code
    18.  
    19. portfunc PROTO :DWORD,:DWORD
    20.  
    21. portfunc proc open:DWORD,hWnd:DWORD
    22. local _dcb:DCB
    23. local dwWait:DWORD
    24. local ddResult:DWORD
    25.  
    26. invoke SelectObject,gl_memdc,hPen
    27.  
    28. invoke CreateFile,offset checked_port,GENERIC_READ or GENERIC_WRITE,0h,0h,OPEN_EXISTING,FILE_FLAG_OVERLAPPED or FILE_ATTRIBUTE_NORMAL,0h
    29. mov hCom,eax
    30.  
    31. invoke GetCommState,hCom,addr _dcb
    32.  
    33. push esi
    34. lea esi,_dcb
    35. assume esi:ptr DCB
    36. mov [esi].BaudRate,CBR_19200
    37. mov [esi].ByteSize,8h
    38. mov [esi].Parity,NOPARITY
    39. mov [esi].StopBits,ONESTOPBIT
    40. assume esi:nothing
    41. pop esi
    42. invoke SetCommState,hCom, addr _dcb
    43.  
    44. invoke CreateEvent,0h,FALSE,FALSE,0h
    45. mov hEvent,eax
    46. mov lpOverlapped.hEvent,eax
    47. invoke SetCommMask,hCom,EV_RXCHAR
    48. mov edx,1h
    49. mov dFlag,edx
    50. mov nNumberOfBytesToWrite,1h
    51.  
    52. jmp over
    53.  
    54.  
    55.  
    56.  
    57.  
    58. again:
    59. mov edx,dword ptr nNumberOfBytesToWrite
    60. invoke ReadFile,hCom,offset lpBuffer2,edx,offset lpNumberOfBytesWritten,offset lpOverlapped
    61. invoke WaitForSingleObject,hEvent,10000
    62. mov ddResult,eax
    63. .if eax==WAIT_OBJECT_0
    64. invoke GetOverlappedResult,hCom,offset lpOverlapped,offset lpNumberOfBytesWritten,FALSE
    65. mov eax,lpNumberOfBytesWritten
    66. .if eax==0h
    67. mov eax,dFlag
    68. .if eax==0h
    69. jmp exit_thread
    70. .endif
    71. jmp again
    72. .endif
    73. .else
    74. mov eax,ddResult
    75. .if eax==WAIT_TIMEOUT
    76. invoke MessageBox,0h,$CTA0("No Data in port"),$CTA0("Time out"),MB_OK
    77. jmp exit_thread
    78. .endif
    79. .endif
    80.  
    81. .data
    82. buf dd ?
    83. cordy dd ?
    84. count10 dd ?
    85. count100 dd ?
    86. fl dd ?
    87. flbytes dd ?
    88. .code
    89.  
    90.  
    91.  
    92. invoke WriteFile,hFile_data,offset lpBuffer2,1h,offset lpNumberOfBytesWritten,0h
    93.  
    94.  
    95. mov edi,offset lpBuffer2
    96. mov eax,[edi]
    97. and eax,0FFh
    98.  
    99. mov edi,offset buf
    100. .if fl==0h
    101. mov fl,1h
    102. mov [edi],eax
    103. jmp again
    104. .else
    105. mov fl,0h
    106. shl eax,8h
    107. add eax,[edi]
    108. mov [edi],eax
    109.  
    110. mov ecx,eax
    111. and ecx,8000h
    112. .if ecx!=8000h
    113. mov fl,1h
    114. jmp again
    115. .endif
    116.  
    117. invoke WriteFile,hFile_data2,offset buf,2h,offset flbytes,0h
    118.  
    119. mov edi,offset buf
    120. mov eax,[edi]
    121.  
    122. and eax,0FFFh
    123. shr eax,4h
    124.  
    125. not eax
    126. and eax,0FFh
    127.  
    128. push eax
    129. push eax
    130. mov edi,offset cordy
    131. mov edx,[edi]
    132. invoke MoveToEx,gl_memdc,510,edx,0h
    133. pop eax
    134. invoke LineTo,gl_memdc,510,eax
    135. pop eax
    136. mov [edi],eax
    137.  
    138. invoke BitBlt,gl_memdc2,STICK,0h,xm,ym,gl_memdc,0h,0h,SRCCOPY
    139. invoke BitBlt,gl_memdc,0h,0h,xm,ym,gl_memdc2,0h,0h,SRCCOPY
    140.  
    141.  
    142.  
    143. add count10,1h
    144. .if count10==20h
    145. invoke InvalidateRect,hWnd_,0h,0h
    146. mov count10,0h
    147. .endif
    148.  
    149.  
    150.  
    151. .endif
    152.  
    153.  
    154.  
    155.  
    156.  
    157. mov eax,dFlag
    158. .if eax!=0h
    159. jmp again
    160. .endif
    161.  
    162.  
    163.  
    164.  
    165.  
    166. exit_thread:
    167. invoke CloseHandle,hEvent
    168. invoke CloseHandle,hCom
    169. invoke CloseHandle,hFile_data
    170. invoke CloseHandle,hFile_data2
    171. invoke GetExitCodeThread,lpThreadHandle,offset dExitCode
    172. .if eax!=0h
    173. ;invoke MessageBox,0h,$CTA0("Поток завершается"),$CTA0("Поток завершается"),MB_OK
    174. .else
    175. invoke MessageBox,0h,$CTA0("Error"),$CTA0("Error"),MB_OK
    176. .endif
    177. invoke ExitThread,dExitCode
    178.  
    179.  
    180.  
    181.  
    182. over:
    183.  
    184. invoke CreateFile,$CTA0("data.txt"),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0h,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0h
    185. mov hFile_data,eax
    186.  
    187. invoke CreateFile,$CTA0("data2.txt"),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,0h,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0h
    188. mov hFile_data2,eax
    189.  
    190. mov count10,0h
    191. mov count100,0h
    192. mov flbytes,2h
    193.  
    194. invoke CreateThread,0h,0h,offset again,0h,0h,lpThreadId
    195. mov lpThreadHandle,eax
    196.  
    197.  
    198. ret
    199. portfunc endp
    Код (Text):
    1. invoke BitBlt,gl_memdc2,STICK,0h,xm,ym,gl_memdc,0h,0h,SRCCOPY
    2. invoke BitBlt,gl_memdc,0h,0h,xm,ym,gl_memdc2,0h,0h,SRCCOPY
    Это 2 виртуальных окна, с помощью которых я двигаю изображение влево.
    А потом копирую виртуальное окно на реальное с помощью invoke InvalidateRect,hWnd_,0h,0h.
    Может быть это из-за invoke InvalidateRect,hWnd_,0h,0h ???
    Может быть можно как-то это оптимизировать???