Autor Thema: GEM-Experten vor! Menüleiste spinnt  (Gelesen 4077 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline Count

  • Benutzer
  • Beiträge: 226
GEM-Experten vor! Menüleiste spinnt
« 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

Online Thorsten Otto

  • Benutzer
  • Beiträge: 1.248
Re: GEM-Experten vor! Menüleiste spinnt
« Antwort #1 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.

Offline ari.tao

  • Benutzer
  • Beiträge: 2.248
  • Gesperrter User
Re: GEM-Experten vor! Menüleiste spinnt
« Antwort #2 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.
Falcon+ddd32MHz, TT+CrazyDotsGK und noch ein paar andere.

Offline KarlMüller

  • Benutzer
  • Beiträge: 412
Re: GEM-Experten vor! Menüleiste spinnt
« Antwort #3 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.

Offline mfro

  • Benutzer
  • Beiträge: 1.637
Re: GEM-Experten vor! Menüleiste spinnt
« Antwort #4 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.
And remember: Beethoven wrote his first symphony in C

Offline Count

  • Benutzer
  • Beiträge: 226
Re: GEM-Experten vor! Menüleiste spinnt
« Antwort #5 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