Je suis perplexe avec le comportement étrange de ne pas ReadDirectoryChangesW avec l'erreur 995. Scénario expliqué ci-dessous.ReadDirectoryChangesW échoue avec l'erreur 995 si CancelIo a été appelée avant
FileHandle a été obtenu en utilisant CreateFileW.
FileHandle obtenu à l'étape 1 a été utilisé dans ReadDirectoryChangesW. Il réussit et envoie la demande au serveur
Sondage pendant 10 secondes et si aucune notification de modification n'a été générée par le serveur, annulez la demande de chnagenotify en utilisant cancelIo. Il envoie annuler & répond du serveur. Maintenant à nouveau modifier la modification notifier avec ReadDirectoryChangesW en utilisant le handle de fichier obtenu à l'étape 1, il échoue avec "995 - L'opération d'E/S a été interrompue en raison d'une sortie de thread ou d'une demande d'application." Aucune requête réelle n'a été envoyée au serveur par cette étape.
Appelez à nouveau ReadDirectoryChangesW en utilisant le handle de fichier obtenu à l'étape 1 & et il envoie une requête au serveur.
les étapes 3,4,5 sont répétées dans une boucle & chaque ReadDirectoryChangesW alternative échoue avec 995 et immédiat suivant réussit.
Quelqu'un peut-il me dire ce qui se passe? Voici le code
void setnotify(WCHAR* _path)
{
OVERLAPPED _overlapped;
HANDLE _handle;
char _buffer[8192] = {0};
DWORD _bufferSize = 8192;
CnState _state = CN_READY;
DWORD _inactivityTime = 0;
typedef enum State
{
CN_READY,
CN_REQUEST_PENDING,
CN_RESPONSE_RECEIVED,
CN_REQUEST_CANCELLED
} CnState;
_handle = CreateFileW(_path,
GENERIC_READ, // access
FILE_SHARE_READ |
FILE_SHARE_WRITE |
FILE_SHARE_DELETE, // share
NULL, // sec
OPEN_EXISTING, // disp
FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, // flags
0);
if (_handle == INVALID_HANDLE_VALUE)
{
exit(-1);
}
memset(&_overlapped, 0, sizeof(OVERLAPPED));
if (!ReadDirectoryChangesW(_handle,
_buffer,
_bufferSize,
true,
0x255,
NULL,
&_overlapped,
NULL)) {
exit(-1);
} else {
_state = CN_REQUEST_PENDING;
wprintf(L"Sent Change notify to Server\n");
}
while (1)
{
if ((_state == CN_REQUEST_PENDING) && (HasOverlappedIoCompleted(&_overlapped))) {
wprintf(L"Response Received from Server\n");
_state = CN_RESPONSE_RECEIVED;
}
if ((_state == CN_RESPONSE_RECEIVED) || (_state == CN_REQUEST_CANCELLED)) {
memset(&_overlapped, 0, sizeof(OVERLAPPED));
_inactivityTime = 0;
if (!ReadDirectoryChangesW(_handle,
_buffer,
_bufferSize,
true,
255,
NULL,
&_overlapped,
NULL)) {
wprintf(L"Sent Change notify to Server Failed.\n");
} else {
wprintf(L"Sent Change notify to Server\n");
_state = CN_REQUEST_PENDING;
}
}
if ((_state == ChangeNotifyRequest::CN_REQUEST_PENDING) &&
(_inactivityTime >= 5000)){
if (CancelIo(_handle)) {
_state = CN_REQUEST_CANCELLED;
wprintf(L"Cancelled Pending Requests.\n");
} else {
wprintf(L"Cancelled failed");
}
}
Sleep(50);
_inactivityTime += 50;
}
}
ci-dessous est l'échantillon O/P:
Envoyé Notification de modification au serveur
Demandes en attente annulés.
envoyés au serveur Notification de modification
Demandes en attente annulés.
Envoyé changement au serveur notify Échec.
envoyés au serveur Notification de modification
Demandes en attente annulés.
Envoyé changement au serveur notify Échec.
envoyés au serveur Notification de modification
Demandes en attente annulés.
Envoyé changement au serveur notify Échec.
Envoyé au serveur Notification de modification
Veuillez montrer votre code plutôt que de le décrire. –
Merci Jonathan. Ajouté le code. – skanyal
est-ce votre code actuel, sur lequel vous obtenez ce résultat? (Par exemple aucun appel GetLastError() dans le code). de toute façon vous logique pour io asynchrone est invalide. tous besoin de faire en absolu d'une autre manière – RbMm