更新文本框在第二个窗体上从线程子不工作VB.Net

时间:2014-12-10 21:12:05

标签: vb.net multithreading

我有两种形式: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相同的调用方法,所以为什么它不起作用?

1 个答案:

答案 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