2011-10-31 4 views
0

私の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番目のスレッドの実行に時間がかかり、コードに問題があるのは正常ですか?

+1

これはあまり進んでいません - あなたがやっていることを示すコードを投稿できますか?特に、ワ​​ーカースレッドからUIをどのように更新していますか? –

+0

mUpdateQueueはどのタイプですか? .NET 4を使用していると仮定すると、 'ConcurrentQueue'または' BlockingCollection'を使うことができ、ロックを必要としません。また、 'mDataCollector.updateV()'は何をしますか? –

+0

ありがとう、私は他のキュー構造を試してみます。 updateV関数は、dllを使用してサーバー上のデータを取得します。 – Johan

答えて

1

複数のスレッドから変数mUpdateQueueにアクセスし、ロックを使用して変数にアクセスしています。これは問題ありませんが、ロックの使用にはオーバーヘッドがあります(ロックを取得するため、および他のスレッドがロックを取得するのを待つ間)。これはおそらく、あなたの新しいスレッドが長くかかっている理由です:ロックを待っています。

ReaderWriterLockSlimクラスを使用すると、変数にすばやくアクセスできます。それが完了したらDisposeに電話する必要があるので、それがIDisposableを実装することを覚えておいてください。

+0

ありがとう、私はそれを見てみましょう。ロックを使用せずに新しいスレッドからメインスレッドの変数にアクセスすると、新しいスレッドが遅くなる可能性がありますか? – Johan

+0

新しいスレッドを作成するには時間がかかりますが、気づかないでしょう – flipchart

関連する問題