我有两种形式:Form1和StreamFrm。 从Form1上的线程子我需要更新StreamFrm上的文本框。 我尝试了以下方法:
Private Sub timerTicks() Handles EventTimer.Tick
If IsCheckingTable = False Then
StreamFrm.Puts7.Text = "test from Form1 : timerticks"
Threading.ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf CheckTableForNewRecords), IsCheckingTable)
End If
Timertxt.Text = Date.Now
End Sub
Private Sub CheckTableForNewRecords(IsCheckingTable)
IsCheckingTable = True
swR.Restart()
swR.Start()
PR = LR
SQL.GETlastrcrd(QueryLR, LR)
NR = LR - PR
strm()
UpdateLastrcrdFrm(LR)
UpdatePrvLrcdrFrm(PR)
UpdateNewrcrdFrm(NR)
If NR > 0 Then
Dim QueryRR As String = "SELECT * from(select ROW_NUMBER() over (Order by StreamingID ) as row, " & _
"StreamingID,WatchlistID,symbol,Bid,Ask,Last,High,Low,PrevClose,Volume,TradeTime," & _
"QuoteTime,TradeDate,QuoteDate,Volatility,OpenInterest,UnderlyingSymbol,CallPut,TradeVolume,TradeAmount,Trade,LastSize from optionstream) " & _
"as StreamingID where StreamingID between " & (PR + 1) & " AND " & LR
SQL.GetTrades(QueryRR)
End If
UpdateTEchecktrades()
IsCheckingTable = False
End Sub
Private Sub strm()
If StreamFrm.Puts6.InvokeRequired Then
StreamFrm.Puts6.Invoke(New action(AddressOf strm))
Else
StreamFrm.Puts6.Text = "test from Form1 : ChecktableFornewrecords"
End If
End Sub
Private Sub UpdateLastrcrdFrm(LR)
If LastrcrdFRM.InvokeRequired Then
LastrcrdFRM.Invoke(New Action(Of Integer)(AddressOf UpdateLastrcrdFrm), LR)
Else
LastrcrdFRM.Text = LR
End If
End Sub
它更新StreamFrm.Puts7.Text =“从Form1测试:timerticks”就好了;它在同一个主题中。
从具有线程的子CheckTableForNewRecords(IsCheckingTable),我调用sub strm(),它检查StreamFrm.Puts6在向其写入文本之前是否需要调用。 这不起作用,没有错误,但文本框中没有文字。
然而LastrcrdFRM.Text = LR确实有效。但是这个文本框在Form1上。
那么如何更新Form StreamFrm上的文本框? 我使用与Form1相同的调用方法,所以为什么它不起作用?
答案 0 :(得分:0)
据我所知,InvokeRequired在控件上调用时没有按预期工作。你需要在表格上打电话。
Private Sub strm()
If StreamFrm.InvokeRequired Then
StreamFrm.Invoke(New action(AddressOf strm))
Else
StreamFrm.Puts6.Text = "test from Form1 : ChecktableFornewrecords"
End If
End Sub