Udostępnij przez


Korzystanie z elementów roboczych

Ostrzeżenie

UMDF 2 jest najnowszą wersją UMDF i zastępuje UMDF 1. Wszystkie nowe sterowniki UMDF powinny być zapisywane przy użyciu funkcji UMDF 2. Do usługi UMDF 1 nie są dodawane żadne nowe funkcje, a obsługa UMDF 1 na nowszych wersjach systemu Windows 10 jest ograniczona. Sterowniki uniwersalne systemu Windows muszą używać funkcji UMDF 2.

Zarchiwizowane przykłady UMDF 1 można znaleźć w Windows 11, wersja 22H2 - Maj 2022 aktualizacja przykładów sterowników.

Aby uzyskać więcej informacji, zobacz Wprowadzenie do usługi UMDF.

Element roboczy to zadanie, które sterownik wykonuje w funkcji wywołania zwrotnego OnWorkItem. Te funkcje działają asynchronicznie.

Sterowniki UMDF często używają elementów roboczych, jeśli onInterruptIsr musi wykonać dodatkowe przetwarzanie bez opóźnienia wykonywania żądania obsługi przerwania (ISR), ponieważ wiersz przerwania może być współużytkowany przez wiele urządzeń.

Zazwyczaj funkcja wywołania zwrotnego OnInterruptIsr sterownika tworzy obiekt elementu roboczego i dodaje go do kolejki elementów roboczych systemu. Następnie wątek puli wątków usuwa z kolejki obiekt i wywołuje zwrotną funkcję elementu roboczego OnWorkItem.

Konfigurowanie elementu roboczego

Aby skonfigurować element roboczy, sterownik musi:

  1. Utwórz element roboczy.

    Sterownik wywołuje funkcję IWDFDevice3::CreateWorkItem , aby utworzyć obiekt elementu roboczego i zidentyfikować funkcję wywołania zwrotnego OnWorkItem , która będzie przetwarzać element roboczy.

  2. Przechowuj informacje o elemencie roboczym.

    Zazwyczaj sterowniki używają pamięci kontekstowej obiektu elementu roboczego do przechowywania informacji o zadaniu, które powinno wykonać funkcja wywołania zwrotnego OnWorkItem . Po wywołaniu funkcji wywołania zwrotnego OnWorkItem można pobrać informacje, korzystając z tej pamięci kontekstowej. Aby uzyskać informacje na temat przydzielania i uzyskiwania dostępu do pamięci kontekstowej, zobaczIWDFObject::AssignContext.

  3. Dodaj element roboczy do kolejki elementów roboczych systemu.

    Sterownik wywołuje element roboczy IWDFWorkItem::Enqueue, który dodaje element roboczy sterownika do kolejki elementów roboczych.

Gdy sterownik wywołuje metodę IWDFDevice3::CreateWorkItem, może opcjonalnie podać obiekt nadrzędny (na przykład obiekt urządzenia lub obiekt kolejki). Gdy system usunie ten obiekt, usuwa również wszystkie istniejące elementy robocze skojarzone z obiektem.

Korzystanie z funkcji wywołania zwrotnego elementu WorkItem

Po dodaniu elementu do kolejki zadań pozostaje on w niej do momentu, aż będzie dostępny wątek roboczy systemu. Wątek procesu roboczego systemu usuwa element roboczy z kolejki, a następnie wywołuje funkcję wywołania zwrotnego OnWorkItem sterownika, przekazując obiekt elementu roboczego jako dane wejściowe.

Zazwyczaj funkcja wywołania zwrotnego OnWorkItem wykonuje następujące czynności:

  1. Uzyskuje informacje o elemencie roboczym dostarczone przez sterownik, uzyskując dostęp do pamięci kontekstowej obiektu elementu roboczego.
  2. Wykonuje określone zadanie. W razie potrzeby funkcja wywołania zwrotnego może wywołać element IWDFWorkItem::GetParentObject w celu określenia obiektu nadrzędnego elementu roboczego.
  3. Jeśli sterownik ponownie kolejkuje element roboczy, wskazuje, że dojście do elementu roboczego jest teraz dostępne do ponownego użycia.

Niektórzy sterowniki mogą potrzebować wywołać IWDFWorkItem::Flush w celu opróżnienia swoich elementów roboczych z kolejki elementów roboczych. Jeśli sterownik wywołuje metodę Flush, metoda nie zwraca, dopóki wątek roboczy nie usunie określonego elementu roboczego z kolejki elementów roboczych i nie wywoła funkcji zwrotnej OnWorkItem sterownika. Funkcja zwrotna OnWorkItem zostanie następnie zwrócona po przetworzeniu elementu roboczego.