0

.NET Framework 3.5 SP1 を使用した VB.NET で、Windows Media Player 12 (wmp.dll) によって提供される WMPLib コンポーネントをいじっています。

名前に基づいてメディア ライブラリからメディア アイテムを取得しようとしています (重複する名前がないことを前提としています)。現時点では、メディア ライブラリ全体を取得して、すべてのメディア アイテムをループし、正しいメディア アイテムが見つかったらループを終了しています。これはうまく機能します (その名前のメディア アイテムが見つからない場合を除く) が、これを行うためのより効率的な方法があることを望んでいました。

これまでの私のコードは次のとおりです。

Public Class WMPTest
    Private myWMP As WMPLib.IWMPCore
    Private myMediaCollection As WMPLib.IWMPMediaCollection
    Private myTrack As WMPLib.IWMPMedia
    Private allTracks As WMPLib.IWMPPlaylist

    Public Sub New()
        ' This call is required by the Windows Form Designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        myWMP = New WMPLib.WindowsMediaPlayer
        myMediaCollection = myWMP.mediaCollection
        allTracks = myMediaCollection.getAll

        Dim theTrack As WMPLib.IWMPMedia = findTrack("Yellow Submarine")
        MessageBox.Show(theTrack.name)
    End Sub

    Public Function findTrack(ByVal strTrackName As String) As WMPLib.IWMPMedia
        For i As Integer = 0 To (allTracks.count - 1)
            If allTracks.Item(i).name = strTrackName Then
                myTrack = allTracks.Item(i)
                Exit For
            End If
        Next
        'myTrack is now the track that we wanted to retrieve
        Return myTrack
    End Function
End Class

したがって、私が本当に必要としているのは、メディア ライブラリ全体 (巨大になる可能性があります) をループすることなく、findTrack() を最適化して処理を実行する方法です。誰にも手がかりがありますか?

4

2 に答える 2

1

より高速な検索を行うにはどうすればよいかを考えているだけです。いくつかのバックグラウンド ワーカーを作成してから、一方のワーカーで 0 から allTracks.count - 1 まで反復し、もう一方のワーカーで allTracks.count - 1 から 0 まで反復します。 RunWorkerCompleted イベントを使用すると、他のワーカーで非同期をキャンセルできます。これにより、検索時間を半分に短縮できる可能性があります。

(count -1) を 4 で割って 25% にすることで、リストの 4 分の 1 でループを同時に実行することもできます。次に、(count-1) から 75% を引いて、途中まで繰り返します。別のいくつかの非同期ワーカーを指します。これにより、検索時間を以前の待機時間の 25% まで削減できる可能性があります。

オブジェクト内での検索をサポートするクラスを作成しているようですが、Backgroundworkers が実際にクラス内で機能するかどうかはわかりません。

ただのアイデア。私は以前にこのようなことをしたことがないので、必要以上に難しくしているかもしれません. 幸運を!あなたが見つけたことを教えてください。

編集: バックグラウンド ワーカーを使用する場合は、このコードを for ループ内に含める必要があると思います。

If BackgroundWorker1.CancellationPending Then
    Exit For
End If
于 2010-04-26T20:11:23.380 に答える
0

IWMPMediaCollectionインターフェイスの「 getByName」メソッドを使用するだけです ;)

于 2013-02-08T18:29:45.357 に答える