私のVB.NETプログラムでは、データを取得してUIを定期的に更新する時間がかかる機能です。私はこの関数を別のスレッドに移しましたが、実行にはかなり時間がかかります。 stopwatchクラスを使用して、メインスレッドの一部である場合は130ミリ秒かかりますが、別のスレッドでは542ミリ秒かかるため、4倍以上遅くなります。コードは.NETの別スレッドで実行するのにかなり時間がかかります
私のCPUはCore I5 M520(2コア)なので、なぜそれほど長くかかるのですか?
私はSystem.Threading.Threadクラスを使用しています。新しいスレッドの優先順位を高く設定しようとしましたが、これは効果がありませんでした。
なぜ別のスレッドがそれほど長くかかるのですか?スピードアップできる方法はありますか?
おかげ
コード
:Public Sub update(ByVal temp As Visual)
SyncLock mUpdateQueue
If Not mUpdateQueue.Contains(temp) Then
mUpdateQueue.Enqueue(temp)
End If
End SyncLock
If Not mainThread.IsAlive Then ' moet hierdie beter doen
mainThread = New Thread(AddressOf DataFetchThread)
mainThread.Start()
End If
End Sub
Private Sub DataFetchThread()
Dim s As New Stopwatch()
s.Start()
Dim temp As Visual = Nothing
While mUpdateQueue.Count > 0
SyncLock mUpdateQueue
temp = mUpdateQueue.Peek()
End SyncLock
mDataCollector.updateV(temp)
SyncLock mUpdateQueue
mUpdateQueue.Dequeue()
End SyncLock
End While
s.Stop()
Debug.WriteLine("thread run time: " & s.ElapsedMilliseconds)
End Sub
mDataCollector.updateV(TEMP):この関数は、データベースからデータを取得し、グラフを作成するために、ピクチャ上の点をプロットします。ここにすべてのコードを追加するのは大変意味がありません。
別の方法でこの質問をする:2番目のスレッドの実行に時間がかかり、コードに問題があるのは正常ですか?
これはあまり進んでいません - あなたがやっていることを示すコードを投稿できますか?特に、ワーカースレッドからUIをどのように更新していますか? –
mUpdateQueueはどのタイプですか? .NET 4を使用していると仮定すると、 'ConcurrentQueue'または' BlockingCollection'を使うことができ、ロックを必要としません。また、 'mDataCollector.updateV()'は何をしますか? –
ありがとう、私は他のキュー構造を試してみます。 updateV関数は、dllを使用してサーバー上のデータを取得します。 – Johan