Srikanth Chadalavada Ответов: 1

Функция Closehandle() windows Зависает


У меня возникла проблема с функцией windows closeHandle((Handle)port) в нашем файле .dll. it не возвращается. Проблема возникает каждые несколько часов.

Приложение java, использующее .dll подключается, считывает и записывает данные. Последний вызов метода java-приложение делает для записи данных, и немедленно вызывается метод release, который вызывает функцию closeHandle в JNI.

Неужели CloseHandle не возвращается, потому что запись все еще происходит? Есть ли способ изящно вернуться к нормальному состоянию, когда closeHandle зависает/ не возвращается. Заранее спасибо.

Ниже приведен код функции, вызывающей closeHandle.

{
    HANDLE port;
    jfieldID portFID = GetFieldId(env, jthis, "portnbr", "J");
    if ( portFID == 0 ){
        flog("ERROR: Java_com_hctsi_comm_Serial_close() portFID=0\n");
        return;
    }
    port = (HANDLE)env->GetLongField(jthis, portFID);
    if ( 0 != port ) {
        flog("Java_com_hctsi_comm_Serial_close() port %d\n", port);
        int count = 0;
        while ( !CloseHandle((HANDLE)port) && count < 10 ) {
            flog("ERROR Java_com_hctsi_comm_Serial_close() closeHandle failed with an error %d\n", count, port, GetLastError);
            flog("ERROR Java_com_hctsi_comm_Serial_close() failed count %d port %d\n", count, port);
            count++;
            Sleep(1000);
        }
        env->SetLongField(jthis, portFID, (jlong)0);
    }
    CloseLog();
}


Что я уже пробовал:

Я ничего не пробовал, потому что это трудно воспроизвести на моем локальном компьютере, но это происходит в производстве с перерывами.

11917640 Member

Единственная причина, которую я вижу, - это неправильное значение дескриптора, переданное CloseHandle. В таком случае результат CloseHandle не определен.

1 Ответов

Рейтинг:
2

KarstenK

Если вы пишете на порт вы должны проверить что данные записаны и чем закройте порт.

Лучше всего открывать только тогда, когда это необходимо, а затем снова закрывать. Читайте о конкретных тайм-аутах этого порта.

Точнее о нет открыв несколько портов или дважды закрыв порты, это может привести к странным результатам. Используйте какой-нибудь внутренний элемент или установите флаг.