Synchronisieren der Verwendung eines parallelen Ports
Clients müssen die Verwendung eines parallelen Ports synchronisieren, indem sie vor der Verwendung einen parallelen Port zuweisen und den Port freigeben, nachdem sie ihn verwendet haben.
Alternativ kann ein Client ein IEEE 1284.3-Gerät auswählen und deaktivieren (das einen parallelen Port automatisch zuordnet und freigibt) – siehe Auswählen und Aufheben der Auswahl eines IEEE 1284-Geräts, das an einen parallelen Port angefügt ist.
Ein Client verwendet die folgenden Gerätesteuerungsanforderungen, um einen parallelen Port zuzuweisen und frei zu geben:
IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE
IOCTL_INTERNAL_PARALLEL_PORT_FREE
Ein Client im Kernelmodus kann auch die vom System bereitgestellten parallelen Portrückrufroutinen verwenden, die mithilfe einer IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO-Anforderung abgerufen werden. Diese Anforderung gibt eine PARALLEL_PORT_INFORMATION-Struktur zurück, die die folgenden Zeiger auf vom System bereitgestellte Rückrufe enthält:
Der TryAllocatePort-Member ist ein Zeiger auf einen PPARALLEL_TRY_ALLOCATE_ROUTINE Rückruf, bei dem es sich um eine Nichtblockierungsroutine handelt, die versucht, einen parallelen Port zuzuweisen.
Das QueryNumWaiters-Element ist ein Zeiger auf einen PPARALLEL_QUERY_WAITERS_ROUTINE Rückruf, der die Anzahl der Anforderungen zur Portzuweisung und Geräteauswahl zurückgibt, die in der Arbeitswarteschlange eines parallelen Ports in die Warteschlange eingereiht werden.
Das FreePort-Mitglied ist ein Zeiger auf einen PPARALLEL_FREE_ROUTINE Rückruf, der einen parallelen Port freigibt.
Die IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE Anforderung erfordert die geringste Behandlung durch einen Client, da der vom System bereitgestellte Funktionstreiber für parallele Ports die Anforderung für den Client in die Warteschlange stellt, wenn der parallele Port bereits zugewiesen ist. Der Funktionstreiber schließt eine Zuordnungsanforderung mit einer status von STATUS_SUCCESS ab, nachdem er den Port einem Client zugewiesen hat. Ein Client kann eine ausstehende Zuordnungsanforderung jederzeit aufgrund einer inakzeptablen Timeoutverzögerung oder einer anderen gerätespezifischen Bedingung abbrechen.
Hinweis Der PPARALLEL_TRY_ALLOCATE_ROUTINE Rückruf wird sofort zurückgegeben (ist nicht blockiert). Wenn ein Client nur den PPARALLEL_TRY_ALLOCATE_ROUTINE Rückruf verwendet, um einen parallelen Port zuzuordnen, für den andere Clients kämpfen, weist der Parallelportfunktionstreiber den Port möglicherweise nie dem Client zu. Um den Erfolg sicherzustellen, muss ein Client eine Anforderung zur parallelen Portzuweisung verwenden. (Der Parallelport-Funktionstreiber warteschlangen und verarbeitet anschließend Anforderungen, Portzuweisungen und Geräteauswahl in der Reihenfolge, in der die Anforderungen empfangen werden.)
Nachdem der Parallelport-Funktionstreiber einem Client einen parallelen Port zugewiesen hat, hat der Client exklusiven Zugriff auf den Port. Der Client muss den PPARALLEL_FREE_ROUTINE Rückruf aufrufen, um den Port frei zu geben. Nachdem der Client den Port freigegeben hat, entfernt der Parallelport-Funktionstreiber die nächste Anforderung (eine Portzuweisung oder Geräteauswahlanforderung), falls vorhanden, aus der Arbeitswarteschlange des Ports und schließt die Anforderung ab.
Ein Client sollte den PPARALLEL_QUERY_WAITERS_ROUTINE Rückruf verwenden, um zu bestimmen, ob andere Clients auf einen parallelen Port warten. Ein Client, der einen Port für einen längeren Zeitraum zuweisen muss, sollte in regelmäßigen Abständen den PPARALLEL_QUERY_WAITERS_ROUTINE Rückruf aufrufen, um festzustellen, ob andere Clients auf den Erwerb des Ports warten, und, wenn Clients warten, den Port so schnell wie möglich freigeben.