调用多媒体计时器,lTimeID = timeSetEvent(10, 0, AddressOf TimeProc, 1, 1)
Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, _
    ByVal dw1 As Long, ByVal dw2 As Long)  
  On Error Resume Next
Form1.CommonDialog1.Action = 1
Form1.txtNoteEdit.Text = ""
Open Form1.CommonDialog1.FileName For Input As #1
If Err.Number = 0 Then
Do While Not EOF(1)
Line Input #1, inputdata
Form1.txtNoteEdit.Text = Form1.txtNoteEdit.Text + inputdata + Chr(13) + Chr(10)
Loop
Close #1
End If
End Sub
Sub EndCount()
timeKillEvent lTimeID
End Sub
我记得看到一个帖子,也是出现这个问题。是不是timepro里面不能写open 语句,那我应该怎么存储我的数据。谢谢大家

解决方案 »

  1.   

    1毫秒取一次的话,为什么不用timer控件呢?
      

  2.   

    豆子犯迷糊了,timer 的 精密性太差。timeSetEvent使用不当会导致VB崩溃。
      

  3.   

    前两天刚看过这方面的讨论,一般都建议用PostMessage 在TimeProc 内进行处理http://www.xtremevbtalk.com/showthread.php?t=96917
    http://www.visualbasicforum.com/showthread.php?t=126157
      

  4.   

    PostMessage不会用呢。看了半天都是英文的,有没有简单的代码。而且用了之后能否保证打包后不出问题。有没有好办法呢
      

  5.   

    我在timepro中加入了一句PostMessage m_hWnd, m_Msg, uID, ByVal 0,生成可执行文件后还是不行。大家都跑哪里去了,也不帮帮俺。
      

  6.   

    timeSetEvent函数里面使用了多线程好像……
      

  7.   

    Private Sub Command1_Click()
    lTimeID = timeSetEvent(10, 0, AddressOf TimeProc, 1, 1) '调用多媒体触发器函数
    End Sub
    Private Sub Command2_Click()
    EndCount
    End Sub
    下面的是在module1里的代码:
    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
    Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
    Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public lTimeID As Long
    Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, _
        ByVal dw1 As Long, ByVal dw2 As Long)
        PostMessage m_hWnd, m_Msg, uID, ByVal 0
        Open "f:\\1.txt" For Input As #1
        If Err.Number = 0 Then
        Line Input #1, inputdata
        Form1.Print inputdata
        Close #1
        End If
    End Sub
    Sub EndCount()
    timeKillEvent lTimeID
    End Sub
    谢谢
      

  8.   

    northwolves(狼行天下) 帮俺看了没有呀。大家想想,还有其他的存储方式吗?哪种存数据的方法最快?文件的存储除了open之类的语句还有其他的语句吗?谢谢
      

  9.   

    奇怪,编译后还是 VB崩溃,有空再看看:
    bas:
    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
    Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
    Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public lTimeID As Long, k As Long
    Public a(10000) As String
    Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, _
        ByVal dw1 As Long, ByVal dw2 As Long)
    k = k + 1
    Form1.Caption = a(k)
    If k = 10000 Then EndCount
    PostMessage Form1.hwnd, uMsg, dwUser, ByVal 0
    End Sub
    Sub EndCount()
    timeKillEvent lTimeID
    End Subform1:
    Private Sub Command1_Click()
    lTimeID = timeSetEvent(10, 0, AddressOf TimeProc, 1, 1) '调用多媒体触发器函数
    End Sub
    Private Sub Command2_Click()
    EndCount
    End SubPrivate Sub Form_Load()
    For i = 0 To 10000
    a(i) = i  i
    Next
    End Sub存数据的方法最快的还是数组,写入数组,最后一次性写进文件。BINARY 方式快些。
      

  10.   

    to:northwolves(狼行天下) 我想在将数据存入文件后接着再调用回调函数,应该在哪里写呢。我现在是放一个timer在上面,设置其interval为1ms。循环判断回调函数是不是完成,就是在If k = 10000 Then EndCount后面加上flag=true。这样调用行吗?是不是回调函数不能再调用回调函数。应该怎么办?
    我就是想在采集1000个数据后存入文件,然后再调用多媒体定时器接着采集,如此循环。现在不知道应该怎么循环调用多媒体记时器。谢谢
      

  11.   

    试试'bas:Option ExplicitPublic 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
    Public Declare Function timeKillEvent Lib "winmm.dll" (ByVal uID As Long) As Long
    Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public lTimeID As Long, k As Long
    Public a(1 To 1000) As String
    Public Sub TimeProc(ByVal uID As Long, ByVal uMsg As Long, ByVal dwUser As Long, _
        ByVal dw1 As Long, ByVal dw2 As Long)
    k = k + 1
    Form1.Caption = a(k)
    If k = 1000 Then
     Open "d:\temp.txt" For Binary As #1
     Put #1, LOF(1) + 1, Join(a, vbCrLf) & vbCrLf
     Close #1
     k = 0
     End If
    PostMessage Form1.hwnd, uMsg, dwUser, ByVal 0
    End Sub
    Public Sub EndCount()
     If lTimeID <> 0 Then timeKillEvent lTimeID
    End SubPublic Sub makeaTimer(Interval As Long)
     If lTimeID <> 0 Then timeKillEvent lTimeID
    lTimeID = timeSetEvent(Interval, 0, AddressOf TimeProc, 1, 1)
    End Sub
    'form1:Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongDim i As Integer
    Private Sub Command1_Click()
    makeaTimer 1
    End Sub
    Private Sub Command2_Click()
    EndCount
    End SubPrivate Sub Command3_Click()
     ShellExecute hwnd, "open", "d:\temp.txt", vbNullString, vbNullString, 5
    End SubPrivate Sub Form_Load()
    For i = 1 To 1000
    a(i) = i
    Next
    End Sub
      

  12.   

    还是不行。执行到If k = 1000 Then这句就出错。麻烦你帮我再想想。是不是里面不能用open
      

  13.   

    很多。采集振动的加速度、速度和幅值。每1ms取一个数据,要采集很长时间的。这样数据会很大的。光一秒内就有一千个数据呢。没有数组那么大,一次能存储这么多的数据。另外多媒体及时器用的时间越长,采集的速度越慢。最后好像走不动了似的。
    能不能每采1000个数据就endcount一次,发出一个flag=true。在timepro外面执行保存数据的代码。存完数据后再调用多媒体及时器取数据。但是在哪里写再调用多媒体计时器的代码呢?
    多媒体及时器里面存入数据库的代码不崩溃,只是存数据库耽误时间,更是使多媒体计时器取不到1ms。麻烦您有空的时候帮我想想,谢谢
      

  14.   

    具体怎么做?我看到vc中是这样做的,存入buffer中。可是在vb 中我不会呀。而且也要至少2个线程吧。帮我写一段代码吧。谢谢