Condividi tramite


Sincronizzazione dell'uso di una porta parallela

I client devono sincronizzare l'uso di una porta parallela allocando una porta parallela prima di usarla e liberando la porta dopo averla usata.

In alternativa, un client può selezionare e deselezionare un dispositivo IEEE 1284.3 (che alloca e libera automaticamente una porta parallela) - vedere Selezione e selezione di un dispositivo IEEE 1284 Collegato a una porta parallela.

Un client usa le richieste di controllo del dispositivo seguenti per allocare e liberare una porta parallela:

IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE

IOCTL_INTERNAL_PARALLEL_PORT_FREE

Un client in modalità kernel può usare anche le routine di callback della porta parallela fornite dal sistema ottenute usando una richiesta di IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO . Questa richiesta restituisce una struttura PARALLEL_PORT_INFORMATION che include i puntatori seguenti ai callback forniti dal sistema:

  • Il membro TryAllocatePort è un puntatore a un callback PPARALLEL_TRY_ALLOCATE_ROUTINE , che è una routine non sbloccante che tenta di allocare una porta parallela.

  • Il membro QueryNumWaiters è un puntatore a un callback PPARALLEL_QUERY_WAITERS_ROUTINE , che restituisce il numero di richieste di allocazione di porta e di selezione del dispositivo accodate nella coda di lavoro di una porta parallela.

  • Il membro FreePort è un puntatore a un callback PPARALLEL_FREE_ROUTINE , che libera una porta parallela.

La richiesta di IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE richiede la gestione minima da parte di un client perché il driver di funzione fornito dal sistema per le porte parallele accoda la richiesta per il client se la porta parallela è già allocata. Il driver di funzione completa una richiesta di allocazione con stato di STATUS_SUCCESS dopo aver allocato la porta a un client. Un client può annullare una richiesta di allocazione in sospeso in qualsiasi momento a causa di un ritardo di timeout inaccettabile o di una condizione specifica del dispositivo.

Nota Il callback PPARALLEL_TRY_ALLOCATE_ROUTINE restituisce immediatamente (non blocca). Se un client usa solo il callback PPARALLEL_TRY_ALLOCATE_ROUTINE per tentare di allocare una porta parallela per cui altri client sono in lotta, il driver della funzione di porta parallela potrebbe non allocare mai la porta al client. Per garantire l'esito positivo, un client deve usare una richiesta di allocazione della porta parallela. Le code del driver della funzione di porta parallela e successivamente elaborano, allocare le porte e selezionare le richieste nell'ordine in cui vengono ricevute le richieste.

Dopo che il driver della funzione di porta parallela alloca una porta parallela a un client, il client ha accesso esclusivo alla porta. Il client deve chiamare il callback PPARALLEL_FREE_ROUTINE per liberare la porta. Dopo che il client libera la porta, il driver della funzione di porta parallela rimuove la richiesta successiva (una richiesta di allocazione porta o selezione dispositivo), se presente, dalla coda di lavoro della porta e completa la richiesta.

Un client deve usare il callback PPARALLEL_QUERY_WAITERS_ROUTINE per determinare se sono presenti altri client in attesa di una porta parallela. Un client che deve allocare una porta per un periodo di tempo esteso deve chiamare periodicamente il callback PPARALLEL_QUERY_WAITERS_ROUTINE per determinare se altri client sono in attesa di acquisire la porta e, se i client sono in attesa, liberare la porta il prima possibile.