danilasv писал(а):Нет, вставил в обычный таймер. Всё равно таймер API приостанавливается при открытии CommonDialog
Происходит какое - то прерывание выполнения Do While - Loop. Открывается диалоговое окно CommonDialog (модальное) с фокусом и идёт прерывание Do While - Loop на форме.
arthur2 писал(а):Попробуй разорвать действие, вызывающее диалог и сам вызов диалога: Скажем, диалог у тебя вызывается по клику на кнопке. И ты не выйдешь из клика, пока диалог не закроется Попробуй по клику на кнопке запускай стандартный таймер (тогда из клика выйдешь сразу), а уже по таймеру - открывай диалог.
Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
Public Declare Function timeSetEvent Lib "winmm.dll" (ByVal uDelay As Long _
, ByVal uResolution As Long, ByVal lpFunction As Long _
, ByVal dwUser As Long, ByVal uFlags As Long) As Long
danilasv писал(а):Посмотрите пример таймера с разрешением 1 миллисекунда на базе API timeGetTime
http://webfile.ru/
Номер файла для скачивания 2636975
Сергей
danilasv писал(а):Спасибо tyomitch
Решение с добавлением обычного Timer не помогает. TimeGetTime останавливается.
Option Explicit
Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "User32" ()
Private Const WM_NCLBUTTONDOWN = &HA1
Private Const HTCAPTION = 2
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, Y As Single)
Dim ReturnValue As Long
If Button = 1 Then
Call ReleaseCapture
ReturnValue = SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End If
End Sub
danilasv писал(а):...
Я разработал свой таймер (генератор) с точностью 100 микросекунд...
...
Посмотрите пример таймера с разрешением 1 миллисекунда на базе API timeGetTime...
danilasv писал(а):...
Теперь перехожу к исследованию таймера с более высоким разрешением (микросекунды), т.к. мне нужно изменять Темп плавно с шагом 0.1 миллисекунда (100 микросекунд)
TimeGetTime имеет разрешение 1 миллисекунда
tyomitch писал(а):Нужно, но добрый бейсик всё помечает за нас сам.
Public Declare Function FT_Open Lib "FTD2XX.DLL" (ByVal intDeviceNumber As Integer, ByRef lngHandle As Long) As Long
Public Declare Function FT_Close Lib "FTD2XX.DLL" (ByVal lngHandle As Long) As Long
Public Declare Function FT_Read Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal lpszBuffer As String, ByVal lngBufferSize As Long, ByRef lngBytesReturned As Long) As Long
Public Declare Function FT_Write Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal lpszBuffer As String, ByVal lngBufferSize As Long, ByRef lngBytesWritten As Long) As Long
Public Declare Function FT_SetBaudRate Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal lngBaudRate As Long) As Long
Public Declare Function FT_SetDataCharacteristics Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal byWordLength As Byte, ByVal byStopBits As Byte, ByVal byParity As Byte) As Long
Public Declare Function FT_SetFlowControl Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal intFlowControl As Integer, ByVal byXonChar As Byte, ByVal byXoffChar As Byte) As Long
Public Declare Function FT_SetTimeouts Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal lngReadTimeout As Long, ByVal lngWriteTimeout As Long) As Long
Public Declare Function FT_SetBreakOn Lib "FTD2XX.DLL" (ByVal lngHandle As Long) As Long
Public Declare Function FT_SetBreakOff Lib "FTD2XX.DLL" (ByVal lngHandle As Long) As Long
Public Declare Function FT_SetLatencyTimer Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal LatencyTimer As Long) As Long
Public Declare Function FT_GetLatencyTimer Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByRef LatencyTimer As Long) As Long
Public Declare Function FT_SetUSBParameters Lib "FTD2XX.DLL" (ByVal lngHandle As Long, ByVal InTransferSize As Long, ByVal outTransferSize As Long) As Long
....
Public Function WriteRead(outB As String, inCount As Long, P As Byte) As String
Dim strWriteBuffer As String * 256
Dim lngBytesWritten As Long
Dim strReadBuffer As String * 256
Dim lngBytesRead As Long
Dim lngTotalBytesRead As Long
Dim strLoggerBuffer As String
Dim flFailed As Boolean
Dim flTimedout As Boolean
Dim flFatalError As Boolean
Dim ftStatus As Long
flFailed = True
flTimedout = False
flFatalError = False
lngTotalBytesRead = 0
lngBytesWritten = 0
If FT_SetDataCharacteristics(lngHandle, FT_BITS_8, FT_STOP_BITS_1, P) <> FT_OK Then
Exit Function
End If
If FT_SetTimeouts(lngHandle, MDIForm1.WaitComm * (inCount + Len(outB)), MDIForm1.WaitComm * Len(outB)) <> FT_OK Then
Exit Function
End If
If FT_Write(lngHandle, outB, Len(outB), lngBytesWritten) <> FT_OK Then
If FT_Purge(lngHandle, FT_PURGE_TX) <> FT_OK Then
Exit Function
End If
Exit Function
End If
lngBytesRead = 0
ftStatus = FT_Read(lngHandle, strReadBuffer, inCount, lngBytesRead)
If (ftStatus = FT_OK) Or (ftStatus = FT_IO_ERROR) Then
If lngBytesRead = 0 Then flTimedout = True
'lngTotalBytesRead = Len(strReadBuffer)
Else
flFatalError = True
End If
strLoggerBuffer = Left(strReadBuffer, lngBytesRead)
If (flTimedout = False) Or (flFatalError = False) Then
WriteRead = strLoggerBuffer
flFailed = False
Else
WriteRead = ""
End If
End Function
Сейчас этот форум просматривают: Google-бот и гости: 52