我正在使用第三方ActiveX API将记录流式传输到访问表中。在8小时的时间内,我收到了超过10万条记录。它是突发性的,有时我每秒钟收到一条记录,有时我每秒收到很多记录。
我需要对记录应用过滤器和条件,并立即(尽快)显示符合条件的记录。平均每天可能会有10到20条记录。
据我所知,访问权限不支持多线程(我对该主题的知识不存在)。
到目前为止我的经历: 在不应用过滤器/条件的情况下将数据流式传输到表中;它没有延迟。 但是,当我开始动态应用过滤器/条件时,我的流开始延迟。
因此我将流式API保存在一个子目录中。然后创建一个新表单,并使用Timer设置为1秒。
在子Form_Timer中我有代码打开表,查找自上次运行以来的新记录,应用过滤器/条件并显示过滤掉的记录。 由于Form的Timer设置为1秒,并且过滤是从另一个form / sub完成的,我的想法是,流入表中的流可以不间断地进行。在同一时间(在1秒循环中)我有其他代码进行过滤。
然而,它仍然开始延迟流数据。
那么我如何在Access中执行此操作?还是我完全吠叫错了树?我只有一些使用Access的经验,因此我可以选择使用。
我是否可以使用第二个数据库并使用链接表?这样过滤就真正地与流媒体分开了。这会造成任何延迟吗? 如果在Access中无法完成此类任务,我应该使用什么? MY-SQL?任何想法?
感谢您的回复。
这是我正在尝试的代码:
以下代码在我的主表单上;如果我点击“订阅”按钮,记录流开始,只要它是在上午9:30到下午4点之间: TDAComm1是第三方ActiveX API。
Public Sub Subscribe_Click()
Set db = CurrentDb
Set rsCS = db.OpenRecordset("OptionStream", dbOpenDynaset)
L = TDAComm1.Subscribe(TList, TxTDASubTypes.TDAPI_SUB_L1)
End Sub
Private Sub TDAComm1_OnL1Quote(ByVal Quote As Object)
With rsCS
.AddNew
!Symbol = Quote.Symbol
!Bid = Quote.Bid
!Ask = Quote.Ask
!Last = Quote.Last
!High = Quote.High
!Low = Quote.Low.Update
End With
TradeCounter = TradeCounter + 1
End Sub
(大约35个字段,我没有在这里发布) 然后,附加到另一个表单我使用以下代码打开optionStream表作为快照,并使用Form_Timer(设置为1秒)将过滤器应用于最后一秒添加的记录。
Private Sub Form_Timer()
Dim ToD As Date
ToD = TimeValue(Now)
If ToD >= TimeValue("09:30:00 AM") And ToD <= TimeValue("16:30:00 PM") Then
Me.MH = True
If LookForTradesFinished = True Then
LookForTrades
End If
Else
Me.MH = False
End If
End Sub
Public Sub LookForTrades()
If TradeCounter > TotalTrades Then
Dim Tradecntr As Integer
Tradecntr = TradeCounter
LookForTradesFinished = False
Dim Newtrade As Double
Dim T As Integer
Dim Y As Integer
Dim TN As Integer
Me.LookTrades = False
Me.Tradecount = Tradecntr
Me.Trads = TotalTrades
Newtrade = Tradecntr - TotalTrades
Me.Newtr = Newtrade
Set rsOS = db.OpenRecordset("OptionStream", dbOpenSnapshot)
With rsOS
.MoveLast
V = 0
If Newtrade > 1 Then
For U = 1 To (Newtrade - 1)
.MovePrevious
V = U
If .BOF Then
Exit For
End If
Next
Else
V = 1
End If
For U = 1 To V
If !Trade = "Ask" Or !Trade = "Above Ask" Then
If !TradeVolume <= !OpenInterest Then
strstatus = Chr(36) & !Symbol & " " & "Qty " & !TradeVolume & " at " & !Last & " " & !Trade & " " & Chr(36) & " " & _
!TradeAmount & " " & "Vol " & !Volume & " " & "OI " & !OpenInterest & " " & "TimeOfTrade " & !TradeTimeCalc
Else
strstatus = Chr(36) & !Symbol & " " & "Qty " & !TradeVolume & " at " & !Last & " " & !Trade & " " & Chr(36) & " " &_
!TradeAmount & " " & "Vol " & !Volume & " " & "OI " & !OpenInterest & " " & "QTY" & Chr(62) & "OI" & " " & "TimeOfTrade
" & !TradeTimeCalc
End If
If !CallPut = "C" Then
For T = 0 To 3
ShwCtrades(T) = ShwCtrades(T + 1)
Me.Controls("SPYC" & T) = ShwCtrades(T)
Next
ShwCtrades(4) = strstatus
Me.Controls("SPYC" & 4) = strstatus
Else
For T = 0 To 3
ShwPtrades(T) = ShwPtrades(T + 1)
Me.Controls("SPYP" & T) = ShwPtrades(T)
Next
ShwPtrades(4) = strstatus
Me.Controls("SPYP" & 4) = strstatus
End If
End If
.MoveNext
If .EOF Then
Exit For
End If
Next
End With
rsOS.Close
End If
Me.LookTrades = True
LookForTradesFinished = True
End Sub
所以我不清楚以下内容:
当LookForTrades子进入表格并对新记录应用过滤器,并且只在我的表单上显示那些新记录时,我的主表单上的子句可以继续同时流入表格吗? 或者是在LookForTrades子项完成之前停止了吗?如果是这种情况,它可以解释为什么有时我的流媒体开始延迟。
延迟我的意思是: 每条记录都有自己的时间戳。我将此时间戳与当前时间进行比较,通常不会有超过1或2秒的差异。但是当它开始延迟时,我看到记录的时间戳和当前时间之间的差异越来越大。 这让我相信Access无法跟上流。 因此,我的问题是Access是否可以执行如上所述的“多任务处理”。