kategoria: ANSI C
[#1] Problem z timerem w aplikacji MUI - zawiesza się podczas ASL i połączeń
Mam problem z implementacją timera w mojej aplikacji MUI. Aplikacja działa dobrze z prostym timera który działa jak aplikacja nie jest w tle, niestety z timer device zawiesza się gdy naciskam "Connect" lub "Add Files” czy jakikolwiek ASL file requester. Ctrl+C nadal działa, więc główna pętla chodzi, ale coś blokuje Wait().

Próbowałem:
  • Timer.device z UNIT_MICROHZ + sygnały
  • EClock z ReadEClock()
  • Proste liczniki w głównej pętli
  • Wyłączanie timera podczas ASL requestów


Pytania:

  • Czy ktoś miał podobny problem z timerem w aplikacjach MUI?
  • Jaki jest najlepszy sposób na timer w MUI który nie koliduje z ASL?
  • Czy powinienem używać prostego licznika w głównej pętli zamiast timer.device?
  • Może lepiej użyć MUIM_Application_Input z krótkimi timeoutami?


Czy macie jakieś sprawdzone rozwiązania? Będę wdzięczny za każdą pomoc!
Tu jest kod, kiedyś go podzielę. https://github.com/sandlbn/u64ctl/blob/main/src/main_player.c
[#2] Re: Problem z timerem w aplikacji MUI - zawiesza się podczas ASL i połączeń

@sand, post #1

Wydaje mi sie, ze problem z timer.device i asl moze wynikac z niewlasciwej obslugi sygnalow.
W tej chwili twoj program dziala tak:
W glownej petli odczytujesz signals, nastepnie wywolujesz funkcje obslugi przyciskow np AddFiles, w ktorej to obsludze zamykasz glowne okno (co moze powodowac realokacje bitow dla sygnalow), nastepnie czyscisz kolejke wiadomosci, efektywnie zerujac sygnaly z zamknietego glownego okna. Nastepnie otwierasz glowne okno ponownie, i juz w glownej petli wykonujesz Wait na starych sygnalach z poprzednio otwartego glownego okna, ktore dodatkowo wczesniej wyzerowales w funkcji. To nie ma prawa dzialac.
Usun zamykanie i otwieranie glownego okna i zerowanie kolejki wiadomosci w AddFiles.
W main dodaj wyzerowanie signals przed DoMethod (linia 3332).
Moze zadziala :)
1
[#3] Re: Problem z timerem w aplikacji MUI - zawiesza się podczas ASL i połączeń

@docent, post #2

dzieki zrobiłem jak powiedziałeś https://github.com/sandlbn/u64ctl/pull/1/files, Teraz mam inny problem. Timer uruchamia się prawidłowo i odlicza pierwszą sekundę (0:00 → 0:01), ale potem się zatrzymuje i aplikacja przestaje reagować na kliknięcia (tylko Ctrl+C działa).

// Główna pętla
while (running) {
    signals = 0;
    ULONG id = DoMethod(objApp->App, MUIM_Application_NewInput, &signals);
    
    // ... obsługa eventów MUI ...
    
    // Obsługa timera
    ULONG waitSignals = signals | SIGBREAKF_CTRL_C;
    if (TimerRunning && TimerSig) {
        waitSignals |= TimerSig;
    }
    
    if (waitSignals & ~SIGBREAKF_CTRL_C) {
        ULONG receivedSignals = Wait(waitSignals);
        
        if (receivedSignals & TimerSig) {
            struct Message *msg = GetMsg(TimerPort);
            if (msg) {
                TimerRunning = FALSE;
                objApp->current_time++;
                UpdateDisplay();
                StartPeriodicTimer(); // Tu chyba problem?
            }
        }
    }
}


Czy ma ktoś ma sprawdzony wzorzec obsługi timer.device w pętli MUI? Gdzie mogę robić błąd w synchronizacji sygnałów?
[wyróżniony] [#4] Re: Problem z timerem w aplikacji MUI - zawiesza się podczas ASL i połączeń

@sand, post #1

Czy macie jakieś sprawdzone rozwiązania?
W MUI SDK jest przykład jak używać timera w głównej pętli ("InputHandler.c").
1
[wyróżniony] [#5] Re: Problem z timerem w aplikacji MUI - zawiesza się podczas ASL i połączeń

@sand, post #3

Nie ustawiasz TimerRunning = FALSE przed wywolaniem StartPeriodicTimer.
Gdy przychodzi sygnal od timera w CheckTimerSignal wywolujesz StartPeriodicTimer ale TimerRunning resetujesz po tym wywolaniu. StartPeriodicTimer uruchamia nowy timer tylko gdy TimerRunning= FALSE, wiec masz taki problem jak opisales.
Ja bym skrocil CheckTimerSignal do takiej postaci:
static BOOL CheckTimerSignal(ULONG sigs)
{
	struct Message *msg;
	BOOL timer_fired = FALSE;

    	if (TimerPort || TimerRunning || (sigs & TimerSig))
	{
    		while ((msg = GetMsg(TimerPort)))
		{
			timer_fired = TRUE;
                	TimerRunning = FALSE;
        		if (objApp && objApp->state == PLAYER_PLAYING)
			{
				objApp->current_time++;
				APP_UpdateCurrentSongDisplay();
				if (objApp->current_time >= objApp->total_time)
				{	
					APP_Next();
				}
				StartPeriodicTimer();
			}
		}
	}
	return timer_fired;
}

Poza tym w main ten test jest zbedny, bo robisz go ponownie w CheckTimerSignal:
if (TimerRunning && TimerSig && (receivedSignals & TimerSig)) {
CheckTimerSignal(receivedSignals);
2
[#6] Re: Problem z timerem w aplikacji MUI - zawiesza się podczas ASL i połączeń

@docent, post #5

Super się przydało – dzięki @docent! 🔥 Nie wiem jak mogłem to przeoczyć ale teraz to logiczne i wszystko bangla. 👌

2
[#7] Re: Problem z timerem w aplikacji MUI - zawiesza się podczas ASL i połączeń

@Krashan, post #4

Dzieki, przydało się. Szkoda, ze jest tak mało tak dobrze rozpisanych przykładów.
1
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem