atari-home.de - Foren

Software => Coding => Thema gestartet von: Count am Fr 31.05.2019, 21:01:20

Titel: GEM-Experten vor! Menüleiste spinnt
Beitrag von: Count am Fr 31.05.2019, 21:01:20
Moin zusammen,

jetzt sind GEM-Experten gefragt. Ich habe bei einem Programm ein seltsames Phänomen: Unter bestimmten Voraussetzungen "verschwinden" die Texte der Menüleiste. Das heißt sie werden durch eine weiße Fläche ersetzt.

Kurz zu den Umständen und dem Programm:

Ich habe in einem Fenster ein Formular zur Datenerfassung. Das ganze ist - wie bei einem Texteditor auch - von Hand programmiert. Das heißt, das Programm wartet in einer Schleife mit evnt_multi() auf Texteingaben, Nachrichten, Mausklicks. Zusätzlich gibt es noch einen Timer, der alle 500 ms den Textcursor ein- oder ausschaltet, um ein Blinken zu erzeugen.

Das ganze sieht in C etwa so aus:

int
get_char()
{
    short aktion;
    int   ch = EOF;

    do {
        short evnt_ret;
        short msg[8];
        short mx, my, mk, key, kstat;

        evnt_ret = evnt_multi(MU_MESAG | MU_TIMER | MU_BUTTON | MU_KEYBD,
                              1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, msg, 500,
                              &mx, &my, &mk, &kstat, &key, NULL
                             );

        if ((evnt_ret & MU_TIMER) != 0) {
            gem_cursor_blink(); // Cursor blinken lassen
        }

        if ((evnt_ret & MU_MESAG) != 0) {
            // Reagiere irgendwie auf die Message.
        }

        if ((evnt_ret & MU_KEYBD) != 0) {
            // Tastendruck

            aktion = key_handling(kstat, key);

            if (aktion == 0) {
                // kein Hotkey

                const int scan = key >> 8;

                switch (scan) {
                    case SCAN_LEFT:
                        ch = CURSOR_LEFT;
                        break;

                    case SCAN_RIGHT:
                        ch = CURSOR_RIGHT;
                        break;

                    case SCAN_UP:
                        ch = CURSOR_UP;
                        break;

                    case SCAN_DOWN:
                        ch = CURSOR_DOWN;
                        break;

                    default:
                        ch = key & 0xff;
                        break;

                }
            }
        }

        if ((evnt_ret & MU_BUTTON) != 0) {
            // Mausknopf

            // Mach irgendwas...
        }
    } while (ch == EOF && aktion == 0);

    if (aktion != 0) {
        // Mach irgendwas ...
    }

    return ch;
}

Leider kommt es dabei zu dem seltsamen Effekt im Menü, wenn ich mit der Maus das Menü aktiviere, durch einen Klick irgendwohin abbreche und wieder ins Menü gehe.

Füge ich nach dem Aufruf der Blink-Funktion menu_bar(..., MENU_INSTALL) ein, ist alles prima. Die Menüzeile flackert dann natürlich alle paar Sekunden.

Die Blink-Funktion beginnt mit wind_update(BEG_UPDATE) und endet mit wind_update(END_UPDATE).

Wer kann mir einen Tipp geben, was ich falsch mache. Es geht um TOS 2.06. Der Fehler tritt sowohl in Steem SSE als auch auf echter Hardware (MegaSTE) auf. Ich wollte zwei Videos beigefügt, die das ganze illustrieren, aber das klappt irgendwie nicht (wahrscheinlich wegen der Endung mp4). Ich habe sie daher auf meinen Server gelegt:

Fehler: http://www.graf-bussmeier.de/download/temp/fehler.mp4
In Ordnung: http://www.graf-bussmeier.de/download/temp/in_ordnung.mp4
Titel: Re: GEM-Experten vor! Menüleiste spinnt
Beitrag von: Thorsten Otto am Sa 01.06.2019, 05:46:17
Wer kann mir einen Tipp geben, was ich falsch mache.

Die Hauptschleife sieht auf den ersten Blick erstmal ok aus, aber ohne die anderen Funktionen zu sehen wird schwierig zu sagen was da falsch läuft.

Ich kann nur vermuten daß du dir entweder irgendwo den Menübaum zerschiesst, oder aber die Parameter der physikalischen Workstation, die das AES zum zeichnen verwendet, änderst.

Versuch doch einfach mal, alles was du nicht unbedingt brauchst zu deaktivieren, bis der Fehler nicht mehr auftritt.
Titel: Re: GEM-Experten vor! Menüleiste spinnt
Beitrag von: ari.tao am Sa 01.06.2019, 08:13:08
Die Blink-Funktion beginnt mit wind_update(BEG_UPDATE) und endet mit wind_update(END_UPDATE).
Was mir auffiel:
Die Klammerung der Semaphoren ist so inkorrekt. (In Analogie: {[}] anstatt {[]} ).
Könnte sein, daß das den Effekt verursacht, kann jedenfalls nicht schaden, das zu berichtigen.
Titel: Re: GEM-Experten vor! Menüleiste spinnt
Beitrag von: KarlMüller am Sa 01.06.2019, 08:54:41
aber die Parameter der physikalischen Workstation, die das AES zum zeichnen verwendet, änderst.
Genau danach sieht es für mich aus. Da mal alles weiß und dann schwarz ist. Man müsste die Routine gem_cursor_blink sehen und auch wissen woher der VDI Handle kommt.
Titel: Re: GEM-Experten vor! Menüleiste spinnt
Beitrag von: mfro am Sa 01.06.2019, 09:34:47
aber die Parameter der physikalischen Workstation, die das AES zum zeichnen verwendet, änderst.
Genau danach sieht es für mich aus. Da mal alles weiß und dann schwarz ist. Man müsste die Routine gem_cursor_blink sehen und auch wissen woher der VDI Handle kommt.

Glaube ich auch. Das ist das typische Verhalten, wenn man das mit graf_handle() gelieferte physikalische Workstation-Handle weiterbenutzt, statt sich mit v_opnvwk() ein Handle für eine eigene virtuelle Workstation zu holen.
Titel: Re: GEM-Experten vor! Menüleiste spinnt
Beitrag von: Count am Sa 01.06.2019, 11:02:38
Ich kann nur vermuten daß du [...] die Parameter der physikalischen Workstation, die das AES zum zeichnen verwendet, änderst.

Bingo!  :)

vdi_handle = wk_handle = graf_handle(&dummy, &dummy, &dummy, &dummy);
v_opnvwk(work_in, &wk_handle, work_out);

statt

vdi_handle = wk_handle = graf_handle(&dummy, &dummy, &dummy, &dummy);
v_opnvwk(work_in, &vdi_handle, work_out);

Vielen Dank!  :D