W czasie implementowania odczytu sekwencji NMEA (by zapewnić obsługę GPS w MobileGadu) napotkałem dosyc powazny problem.
1. Otworam port "CreateFile"
2. Sekwencyjny odczyt - "ReadFile"
3. Zamkniecie portu "CloseHandle"
Funckja "ReadFile" w pewnych sytuacjach staje się całkowicie blokująca tj. załóżmy, ze w czasie odczytu GPS uruchomimy drugi program korzystający z tej usługi (u mnie jest to np. GPSLocator w n560). Program ten bezproblemowo czyta z GPS, jednak "mój" wątek zostaje całkowicie zablokowany na ReadFile (2). Jak zapobiec takiej sytuacji?
Tzn. rozpatruję 2 rozwiązania
- port w pełni dzielony (wg mnie to powinien zapenić OS "GPS Intermediate Driver", jesli nie zapewni, to przecież zawłaszczenie "exclusive" następuje przy CreateFile, druga aplikacja nie powinna otrzymac dostępu)
- ustawienie timeout - jak? Probowałem następująco:
COMMTIMEOUTS cto = {0};
cto.ReadIntervalTimeout = 0;
cto.ReadTotalTimeoutMultiplier = 0;
cto.ReadTotalTimeoutConstant = 5000;
cto.WriteTotalTimeoutMultiplier = 0;
cto.WriteTotalTimeoutConstant = 0;
Bez efektu, tzn. blokowanie trwa, mimo upływu np. 5 sek.
Bardzo proszę o sugestie... Blokowanie na ReadFile powoduje, iż:
- w pełni nie moge kontrolowac synchronizacji wątków i np. sygnalizacja mojemu wątkowi GPS, by ma np. zakończyć działanie nie przynosi skutku, wątek sygnalizujący czeka po zasygnalizowaniu na efekt w postaci zakonczenia watku roboczego. No i mamy klasyczny deadlock.
- mimo zatrzymania na ReadFile - port chyba juz nie działa, nawet po zamknieciu drugiej aplikacji, gps jest już wyłączony...
Jeśli ktoś byłby skłonny pomóć, jestem gotów przesłać kod źródłowy wątku roboczego "gps".