Более эффективный способ найти медиа-элемент в медиа-библиотеке WMP? - PullRequest
0 голосов
/ 25 апреля 2010

Я возиться с компонентом WMPLib, предоставляемым Windows Media Player 12 (wmp.dll) в VB.NET с .NET Framework 3.5 SP1.

Я пытаюсь извлечь элемент мультимедиа из моей библиотеки мультимедиа на основе его имени (при условии, что нет повторяющихся имен). В данный момент я беру целую всю библиотеку мультимедиа *1003*, перебираю все элементы мультимедиа и выхожу из цикла, когда обнаружил правильный элемент мультимедиа. Это хорошо работает (за исключением случаев, когда медиа-элемент с таким именем не может быть найден), но я надеялся, что есть более эффективный способ сделать это.

Вот мой код:

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 (), чтобы он выполнял свою работу без циклического обхода всей библиотеки мультимедиа (которая может быть огромной). У кого-нибудь есть подсказка?

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

Просто думаю о том, как я могу попытаться провести более быстрый поиск. Я мог бы создать пару фоновых рабочих, а затем перебрать от 0 до allTracks.count - 1 в одном из рабочих, а затем в другом, перебрать из allTracks.count - от 1 до 0. Затем, в зависимости от того, что достигнуто первым, на событие RunWorkerCompleted, вы можете отменить асинхронную на другом работнике. Это потенциально может сократить время поиска вдвое.

Вы также можете запускать циклы в четверти списка одновременно, поделив (count -1) на 4 на 25%, а затем вы можете вычесть его из (count-1) на 75%, а затем выполнить итерацию вверх или вниз на полпути в другой паре асинхронных рабочих. Это может существенно сократить время поиска до 25% от предыдущего ожидания.

Я вижу, что вы создаете класс для поддержки поиска в объекте, и я не знаю, действительно ли фоновые работники функционируют внутри классов, так что я могу быть далеко.

Просто идея. Я не делал ничего подобного раньше, поэтому я могу сделать это намного сложнее, чем нужно. Удачи! Дайте мне знать, что вы узнаете.

Редактировать: Если вы работаете с фоновым рабочим, я думаю, вам нужно будет включить этот код в цикл for:

If BackgroundWorker1.CancellationPending Then
    Exit For
End If
0 голосов
/ 08 февраля 2013

Просто используйте метод " getByName " интерфейса IWMPMediaCollection ;)

...