Software > Coding

GEM-Experten vor! Menüleiste spinnt

(1/2) > >>

Count:
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:


--- Code: ---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;
}

--- Ende Code ---

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

Thorsten Otto:

--- Zitat von: Count am Fr 31.05.2019, 21:01:20 ---Wer kann mir einen Tipp geben, was ich falsch mache.

--- Ende Zitat ---

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.

ari.tao:

--- Zitat von: Count am Fr 31.05.2019, 21:01:20 ---Die Blink-Funktion beginnt mit wind_update(BEG_UPDATE) und endet mit wind_update(END_UPDATE).
--- Ende Zitat ---
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.

KarlMüller:

--- Zitat von: Thorsten Otto am Sa 01.06.2019, 05:46:17 ---aber die Parameter der physikalischen Workstation, die das AES zum zeichnen verwendet, änderst.

--- Ende Zitat ---
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.

mfro:

--- Zitat von: KarlMüller am Sa 01.06.2019, 08:54:41 ---
--- Zitat von: Thorsten Otto am Sa 01.06.2019, 05:46:17 ---aber die Parameter der physikalischen Workstation, die das AES zum zeichnen verwendet, änderst.

--- Ende Zitat ---
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.

--- Ende Zitat ---

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.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln