amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Nochmal Intuition Messages [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- 2 [ - Beitrag schreiben - ]

20.08.2006, 16:01 Uhr

Reth
Posts: 1812
Nutzer
Hallo mal wieder!

Hab noch mal ne Frage zu besagtem Thema.

Ich bearbeite Intuition-Messages eines Fensters wie folgt:

- vorschriftsmäßig alles eintragen und auf Messages warten
- inner Schleife alle anstehenden Messages verarbeiten
- zuerst alle Infos der Message kopieren, dann die Message replien
- nun die Message bearbeiten:
* zuerst MenuMessages
* dann GadgetMessages
* zuletzt IntuiTick Messages

Wenn ich nun im Programm nen Menüpunkt anwähle, wird der gar nicht von Intuition registriert, es kommen immer nur IntuiTicks.
Erst wenn ich den Menüpunkt sehr oft hintereinander anwähle, erfolgt eine Messagebearbeitung.
Liegt das daran, dass ich alle Messages in der Schleife abarbeite und daher so viele IntuiTicks auflaufen, bevor die MenuMessage eintrifft?
Oder gehen die MenuMessages bei der Menge an Nachrichten einfach verloren?

Danke schon mal!
Ciao

[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 18:09 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Reth:
Hallo mal wieder!

Hab noch mal ne Frage zu besagtem Thema.

Ich bearbeite Intuition-Messages eines Fensters wie folgt:

- vorschriftsmäßig alles eintragen und auf Messages warten
- inner Schleife alle anstehenden Messages verarbeiten
- zuerst alle Infos der Message kopieren, dann die Message replien
- nun die Message bearbeiten:
* zuerst MenuMessages
* dann GadgetMessages
* zuletzt IntuiTick Messages

Wenn ich nun im Programm nen Menüpunkt anwähle, wird der gar nicht von Intuition registriert, es kommen immer nur IntuiTicks.
Erst wenn ich den Menüpunkt sehr oft hintereinander anwähle, erfolgt eine Messagebearbeitung.
Liegt das daran, dass ich alle Messages in der Schleife abarbeite und daher so viele IntuiTicks auflaufen, bevor die MenuMessage eintrifft?
Oder gehen die MenuMessages bei der Menge an Nachrichten einfach verloren?

Danke schon mal!
Ciao


Hmm, also ich würde eher sagen daß du irgendwas Falsch machst. An den IntuiTick Msg's kanns eigentlich nicht liegen und Intuition wird wohl auch keine Messages unterdrücken. Bei Intuition kannst du nur für Mousemove Messages angeben nur eine gewisse Anzahl zu ermöglichen.

Am Besten wäre es wohl einfach deinen Code zu posten. Ggf ist dein Messageloop falsch, also in der Art von

code:
while(running) {
Wait(signals);
msg = GetMsg(Port);
...
...
ReplyMsg(msg);
}


anstatt von

code:
while(wunning) {
 Wait(signals);
 while(msg = GetMsg(Port)) {
  ...
  ...
  ReplyMsg(msg);
 }
}


Erstere Version würde zwar weiterhin alle Messages bearbeiten, aber manche ggf Verzögert, d.h. du könntest eine Message bekommen die der Aktion garnicht entspricht.

Die Messages werden von Intuition Alle in einer Liste verkettet, ich denke mal mehr als ein Paar 100 Bytes werden pro Message nicht benötigt, daß pro Sekunde maximal 1Kb an Intuitick Speicher benötigt wird an Speichermangel dürfte das also nicht Liegen.


Messages immer so baearbeiten, dass nach einem Wait() alle Anliegenden Messages abgeholt werden, d.h. bis GetMsg()==NULL ist, nicht nur eine und dann wieder ein Wait();

[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 18:57 Uhr

Ralf27
Posts: 2779
Nutzer
Zitat:
Original von DariusBrewka:
Die Messages werden von Intuition Alle in einer Liste verkettet, ich denke mal mehr als ein Paar 100 Bytes werden pro Message nicht benötigt, daß pro Sekunde maximal 1Kb an Intuitick Speicher benötigt wird an Speichermangel dürfte das also nicht Liegen.


Wenn ich das richtig verstanden habe, dann kommt erst dann eine weitere Intuitick-Meldung, wenn die vorhergehende bestätigt wurde, bzw. erst ab diesme Zeitpunkt wird gerechnet.
Insofern kann es nicht sein das zu viele auflaufen. Es läuft immer nur eine auf die dann wartet.

Bzw. mach ich diese Beobachtung in meinem Programm und hab auch sowas schon hier im Forum gelesen.


--
http://www.alternativercomputerclub.de.vu

[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 20:07 Uhr

whose
Posts: 2156
Nutzer
@Reth:

Das hört sich so an, als würde in Deinem Programm etwas verkehrt laufen. Ich vermute, Du hast bei dem Kopieren der Message einen Fehler drin, der dafür sorgt, daß die meisten Messages vor ihrer eigentlichen Bearbeitung "verworfen" werden, und/oder eine Race Condition, die letztendlich dafür sorgt, daß am meisten IntuiTick-Messages kopiert werden (weil diese recht zügig auflaufen).

Dafür spricht, daß fast nur Intuiticks (die tatsächlich nur dann wieder kommen, wenn der erste Tick beantwortet wurde) "erfaßt" werden und nur "manchmal" die MenuMessages, wenn sie gehäuft auftauchen.

Schau Dir Deinen Code bezüglich des Kopierens der Messages noch einmal genau an, auch die Bearbeitung der Message-Kopien. Nicht, daß Du da durch einen Flüchtigkeitsfehler aus den Kopien hauptsächlich Kopien der ersten IntuiTick-Message machst. Solche "Schnitzer" passieren schnell, wenn man die Bearbeitung der Messages zu beschleunigen versucht.

Grüße

--
---

:boing: µA1 PPC 750GX-800
:boing: A4000 PPC 604e-233

[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 20:55 Uhr

Reth
Posts: 1812
Nutzer
Hier mal der Messagebearbeitungscode:

code:
if ((!port) || (port == NULL)) return;

    cout << "Start message handling..." << endl;

    while (!closing)
    {
        /* Wait until we have recieved a message: */
        Wait( 1 << port->mp_SigBit );

        /* As long as we collect messages sucessfully we stay in the loop: */
        while(struct IntuiMessage *my_message=(struct IntuiMessage *) GetMsg( port ))
        {
            IntuiMessageC intuiMessage(my_message);
            /* After we have read it we reply as fast as possible: */
            /* REMEMBER! do never try to read a message after you have replied! */
            /* Some other process has maybe changed it. */
            ReplyMsg( (struct Message *)my_message );

            if (intuiMessage.getClass() == IDCMP_MENUPICK)
            {
                cout << "\nMenu pick!\n";
                cout << "Closing before = " << closing << endl;
                if (mnMsgRec != NULL) mnMsgRec->receive(intuiMessage);
                cout << "Closing after = " << closing << endl;
                /*closing = TRUE;
                cout << "Closing set = " << closing << endl;*/
            }

            if ((intuiMessage.getClass() == IDCMP_GADGETDOWN) || (intuiMessage.getClass() == IDCMP_GADGETUP))
            {
                cout << "\nGadget selected!\n";
                if (gadMsgRec != NULL) gadMsgRec->receive(intuiMessage);
         }

            if (intuiMessage.getClass() == IDCMP_INTUITICKS)
            {
                cout << "IntuiTicks!" << endl;
                for (vector<ActivityC *>::iterator iterator = tickActivities.begin(); iterator != tickActivities.end(); iterator++)
                {
                    cout << "In Loop!" << endl;
                    IntuiTickActivityC *tickActivity = ((IntuiTickActivityC *)(*iterator));
                    cout << "Activity:" << tickActivity << endl;
                    if (tickActivity != NULL) tickActivity->activate();
                }
            }
        }
    }

    cout << "Message handling done..." << endl;
}


Wie gesagt wird replied bevor bearbeitet wird (eingangs schon erwähnt). Evtl. macht das Ärger? Hab ich ausm Bsp.

Und hier der Kopiercode:

code:
void IntuiMessageC::setMessage(struct IntuiMessage *message)
{
    this->msgClass = message->Class;
    this->code = message->Code;
    this->qualifier = message->Qualifier;
    this->mouseX = message->MouseX;
    this->mouseY = message->MouseY;
    this->seconds = message->Seconds;
    this->micros = message->Micros;
    this->IAddress = message->IAddress;
}


Das Einzige was mir hier evtl Ärger bringen könnte sind vielleicht die Kopien auf die Zeiger IAddress usw.?

Ach ja: Wo findet man hier denn nochmal die möglichen Stylesheets?! Ärger mich gerad, da ich die hier immer nie entdecken kann!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 21:35 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Ralf27:
Wenn ich das richtig verstanden habe, dann kommt erst dann eine weitere Intuitick-Meldung, wenn die vorhergehende bestätigt wurde, bzw. erst ab diesme Zeitpunkt wird gerechnet.
Insofern kann es nicht sein das zu viele auflaufen. Es läuft immer nur eine auf die dann wartet.

Bzw. mach ich diese Beobachtung in meinem Programm und hab auch sowas schon hier im Forum gelesen.


Das mag schon sein, aber wenn du Wait() aufrufst ohne dass Intuition SendSignal() aufruft wartest du dich zu Tode, die Message wird auch Ohne ReplyMsg() von Intuition in die Liste gepackt, wäre auch ziemlich dumm, wenn du z.B. zwei KeyDown Messages von Intuition für die Linke Maustaste bekommst ohne KeyUP, weil Intuition diese Nachricht nicht hat.

Aber bei IntuiTicks kannst du schon Recht haben, daß keine weitere kommt bevor die Alte bearbeitet worden ist, wenn du irgendwo im Prog etwas machst, will man ja nicht Plötzlich 10000000 Intuiticks bekommen :-)

gruss

Darius


[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 21:50 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Reth:
Wie gesagt wird replied bevor bearbeitet wird (eingangs schon erwähnt). Evtl. macht das Ärger? Hab ich ausm Bsp.


So sollte man das ja auch machen, wenn möglich.

Zitat:
Und hier der Kopiercode:

code:
void IntuiMessageC::setMessage(struct IntuiMessage *message)
{
    this->msgClass = message->Class;
    this->code = message->Code;
    this->qualifier = message->Qualifier;
    this->mouseX = message->MouseX;
    this->mouseY = message->MouseY;
    this->seconds = message->Seconds;
    this->micros = message->Micros;
    this->IAddress = message->IAddress;
}



das läßt sich doch einfach überprüfen, gib doch einfach nach GetMsg() die Ursprünglichen Daten aus, ohne Kopiercode, wenn da eine Diskrepanz besteht ist dein Code nicht Richtig.

Zitat:
Das Einzige was mir hier evtl Ärger bringen könnte sind vielleicht die Kopien auf die Zeiger IAddress usw.?

das würde das Problem aber nicht Erklären, da das damit wohl kaum was zu Tun hat. AFAIK benutzt Intuition für Menus und Gadgets im gegensatz zu Windows die Ursprungs Struktur, damit Zeigt IAdress auf deine erzeugte MenuStruktur zum jeweiligem Menupunkt und die Adresse wird sich wohl nicht ändern, so daß du IAdress gewiss Ruhig auslesen kannst, ansonsten mach in deine Kopierfunktion einen neuen Member UserID oder so, der den Eintrag aus der MenuStruktur etc. direkt ausliest.

[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 21:57 Uhr

Reth
Posts: 1812
Nutzer
Woran kanns denn dann liegen?
Daran, dass (wie Ralf meinte) bei IntuiTicks erst nach dem Bearbeiten replied werden sollte? Evtl. war ja die endlich akzeptierte MenuMessage die erste von mir ausgelöste, nur dass alle inzwischen aufgelaufenen IntuiTicks zuerst bearbeitet werden?

Ach und ja: Irgend ein Hinweis auf die Stylesheets für Codestyling hier im Forum?

[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 22:02 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Reth:
Ach und ja: Irgend ein Hinweis auf die Stylesheets für Codestyling hier im Forum?


Du meinst jetzt das Hervorheben von Keywords & Co, z.B. im Code?

unter Hilft/Text-Formatierungen

http://www.amiga-news.de/forum/help_text.php


[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 22:13 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Reth:
Woran kanns denn dann liegen?
Daran, dass (wie Ralf meinte) bei IntuiTicks erst nach dem Bearbeiten replied werden sollte? Evtl. war ja die endlich akzeptierte MenuMessage die erste von mir ausgelöste, nur dass alle inzwischen aufgelaufenen IntuiTicks zuerst bearbeitet werden?


Nee das hat Ralf nicht gesagt, sondern dass Intuition erst dann einen weiteren Intuitick sendet wenn der letzte schon beantwortet worde. Damit sich die Intuiticks nicht anhäufen. Normalerweise hängt Intuition jedes Ereigniss in eine Verkettete Liste damit Nachrichten nicht Verloren gehen, bei KEY und MOUSEBUTTON Events ist das wichtig, aber bei Intuiticks nicht so wirklich wie auch bei Mousemove Events.

Wenn Intuition z.B. eine Mausposition unterschlägt ist das nicht so schlimm, aber es ist z.B. ziemlich unmöglich die Maustasten zweimal hintereinander loszulassen ohne dazwischen diese gedrückt zu haben.

Es gibt hast Messages die eine Art Inverse Message haben z.B. KeyUP/KeyDown Diskinserted/Removed.


[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 22:17 Uhr

Reth
Posts: 1812
Nutzer
Zitat:
Original von DariusBrewka:

Du meinst jetzt das Hervorheben von Keywords & Co, z.B. im Code?

unter Hilft/Text-Formatierungen

http://www.amiga-news.de/forum/help_text.php


Genau! Danke!

[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 22:19 Uhr

Reth
Posts: 1812
Nutzer
Zitat:
Original von DariusBrewka:

Nee das hat Ralf nicht gesagt, sondern dass Intuition erst dann einen weiteren Intuitick sendet wenn der letzte schon beantwortet worde.


Hm, ist beantworten nicht dasselbe wie den Reply auf die Message zu senden?

In dem Fall könnte das ja bei mir der Grund sein? (Reply erfolgt wie gesagt vor Bearbeitung, so dass neuer Tick gesendet werden kann)
Muss ich mal testen!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

20.08.2006, 23:00 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Reth:
Hm, ist beantworten nicht dasselbe wie den Reply auf die Message zu senden?


Sicherlich ist es das Selbe aber es würde dein Problem nicht erklären, denn ob ich nun

msg = GetMsg()
class=msg->class;
ReplyMsg(msg);
cout << class;

oder msg = GetMsg();
cout << msg->class
ReplyMsg(msg);

schreibe ist völlig Egal, die erstere wird aber für Gewöhnlich benutzt, weil Intuition damit z.B. die Message freigibt und damit auch Resourcen.

Zitat:
In dem Fall könnte das ja bei mir der Grund sein? (Reply erfolgt wie gesagt vor Bearbeitung, so dass neuer Tick gesendet werden kann)
Muss ich mal testen!


Ja aber du sagst du bekommst zu viele Intuiticks und keine Menu Messages, ich wüsste jetzt nicht wie das eine zum anderen Passt.

Intuition interessiert sich wohl nicht dafür, was du mit der Message machst, du müsstest eine Menu Message erhalten ob du nun ReplyMsg() vor oder hinter der Bearbeitung einer Intuiticks Message aufrufst.

Intuition sorgt nur dafür dass nur eine Intuiticks MSG in der Schlange ist aber nicht mehr, anders ausgedrückt solange du eine IntuiTicks msg nicht beantwortest schmeisst Intuition Alle folgenden IntuiTicks Msgs ins Nirvana.

Da ist Eindeutig was anderes Falsch, gebe doch nach dem my_message = GetMsg() die Nachricht direkt aus

my_message = GetMsg(...);
cout << my_message->Class;

um zu sehen ob irgedwo in deinen C++ Classes Falsch ist

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 15:13 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von Reth:
Hier mal der Messagebearbeitungscode:

code:
if ((!port) || (port == NULL)) return;
...



Da bekommt man ja Augenkrämpfe...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 15:16 Uhr

thomas
Posts: 7675
Nutzer
@Holger:

doppelt gemoppelt hält besser :lach:

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 15:54 Uhr

Holger
Posts: 8090
Nutzer
@Reth:

Wenn Du code der Form
code:
if (xyz() == ABC)
{
}
if (xyz() == DEF)
{
}
if (xyz() == GHI)
{
}

ist das mindeste, dass Du den Anweisungen ein else spendierst if(xyz()==ABC) ...; else if(xyz()==DEF)...

Aber besser wäre hier wohl von vornherein, switch zu verwenden.

Ausserdem ist die Vorgehensweise für eine korrekte Bearbeitung von MENUPICK nicht ausreichend, intuition erlaubt die Mehrfach-Selektion von Menüpunkten und speichert deren Status in den Menüpunkten selber. Also muss man schon vor der Beantwortung der MENUPICK-Message über die ausgewählten Punkte iterieren und diese Information in der eigenen Datenstruktur speichern, wenn man sie nicht sofort verarbeiten will, sonst überschneidet sich das mit einer möglichen neuen Menüselektion.

Leider haben diese Fehler noch nichts mit Deinem aktuellen Problem zu tun...sie kommen noch dazu...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 16:25 Uhr

Reth
Posts: 1812
Nutzer
Zitat:
Original von Holger:
@Reth:

Wenn Du code der Form
code:
if (xyz() == ABC)
{
}
if (xyz() == DEF)
{
}
if (xyz() == GHI)
{
}

ist das mindeste, dass Du den Anweisungen ein else spendierst if(xyz()==ABC) ...; else if(xyz()==DEF)...

Wieso?
Ist wohl eher ne Frage der Programming Guidlines, bzw. der eine machts so, der andere so!

Zitat:
Aber besser wäre hier wohl von vornherein, switch zu verwenden.

Wenn es die Datentypen von IDCMP_MENUPICK, IDCMP_INTUITICKS etc. zulassen, dann ja!

Ciao

[ Dieser Beitrag wurde von Reth am 21.08.2006 um 16:28 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 16:28 Uhr

Reth
Posts: 1812
Nutzer
Zitat:
Original von Holger:
Zitat:
Original von Reth:
Hier mal der Messagebearbeitungscode:

code:
if ((!port) || (port == NULL)) return;
...



Da bekommt man ja Augenkrämpfe...


Ich bin halt nicht automatisch davon ausgegangen, dass:

code:
if ((!port) ...


das gleiche ist wie:

code:
if ((port == NULL)...


Hab ich noch nirgendwo bestätigt bekommen, aber auch noch nicht explizit danach gesucht.
Und ich habe gelernt: Nur wenns zufällig klappt, heisst es nicht, dass es automatisch richtig ist!
Kann ja sein, dass der Compiler immer automatisch auf NULL initialisiert, und daher die beiden Bedingungen zum gleichen Ergebnis führen?! Aber wehe er macht das mal nicht (mehr)!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 16:32 Uhr

thomas
Posts: 7675
Nutzer
Zitat:
Ist wohl eher ne Frage der Programming Guidlines, bzw. der eine machts so, der andere so!

Nein. Wenn sich der Wert von xyz während der Verarbeitung ändert, kann es durchaus vorkommen, daß bei deinem Konstrukt mehrere Fälle ausgeführt werden. Wenn du eine Fallunterscheidung möchtest, solltest du auch eine Fallunterscheidung programmieren. Wenn du keine Fallunterscheidung, sondern mehrere aneinandergereihte Vergleiche möchtest, die alle wahr oder falsch sein können, dann solltest du das durch Leerzeilen und/oder Kommentare kenntlich machen.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 16:50 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von Reth:
Wieso?
Ist wohl eher ne Frage der Programming Guidlines, bzw. der eine machts so, der andere so!

Nein, wie thomas schon sagte, entweder oder. Wenn der Ausdruck in jedem Test den gleichen Wert liefern sollte, sollte das verwendete Sprachkonstrukt das auch reflektieren. Das heisst, Bedingungen, die gar nicht erfüllt sein können, auch nicht zu testen. Bei Switch wird der Ausdruck außerdem auch nur einmal ausgewertet. Das ist sauberer und effizienter. Wenn er dagegen nicht den gleichen Wert liefern sollte, brauchst Du uns auch gar nicht zu fragen, warum die Auswertung der Messages nicht funktioniert. Die Klasse einer IntuiMessage sollte sich jedenfalls innerhalb einer Auswertung nicht ändern.
Zitat:
Zitat:
Aber besser wäre hier wohl von vornherein, switch zu verwenden.
Wenn es die Datentypen von IDCMP_MENUPICK, IDCMP_INTUITICKS etc. zulassen, dann ja!

Arrgh, welche Datentypen?
Der Datentyp ist der, den Deine Methode IntuiMessageC::getClass() zurückliefert. Und wenn Du den mit Konstanten wie IDCMP_... vergleichen kannst, muss er wohl vom Typ int sein, womit switch funktionieren sollte.

Wenn nicht, dann hätte ich noch eine Idee, warum Dein code nicht funktioniert...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 17:01 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von Reth:
Ich bin halt nicht automatisch davon ausgegangen, dass:

code:
if ((!port) ...


das gleiche ist wie:

code:
if ((port == NULL)...


Hab ich noch nirgendwo bestätigt bekommen, aber auch noch nicht explizit danach gesucht.

Erstens: wenn Du in einer Sprache programmieren willst, solltest Du immer explizit nach dem suchen, was Du benutzt. Denn:
Zweitens: Was bedeutet (!port)? Warum testest Du diese Bedingung? Was testest Du da? Und was bedeutet (port==NULL)? Warum führst Du diesen Test durch?

Wenn Du glaubst, dass es zwei verschiedene Dinge sein könnten, was für zwei Dinge sollten das sein? code ist doch kein Selbstzweck, also was ist der Zweck dieses Tests, den Du da hingeschrieben hast?

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 21:32 Uhr

Reth
Posts: 1812
Nutzer
Zitat:
Original von thomas:
Zitat:
Ist wohl eher ne Frage der Programming Guidlines, bzw. der eine machts so, der andere so!

Nein. Wenn sich der Wert von xyz während der Verarbeitung ändert, kann es durchaus vorkommen, daß bei deinem Konstrukt mehrere Fälle ausgeführt werden. Wenn du eine Fallunterscheidung möchtest, solltest du auch eine Fallunterscheidung programmieren. Wenn du keine Fallunterscheidung, sondern mehrere aneinandergereihte Vergleiche möchtest, die alle wahr oder falsch sein können, dann solltest du das durch Leerzeilen und/oder Kommentare kenntlich machen.

Gruß Thomas


Da steh ich glaub auf dem Schlauch: Das Äquivalent zu XYZ kann sich bei mir während der Bearbeitung nicht ändern. Ich wollte mehrere aneinandergereihte Vergleiche programmieren und dazwischen sind bei mir zumindest Leerzeilen, also genau so wie Du anmerkst.

Dass eine Fallunterscheidung hier besser ist seh ich ja ein.

Ciao

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 21:33 Uhr

Reth
Posts: 1812
Nutzer
Zitat:
Original von Holger:

Erstens: wenn Du in einer Sprache programmieren willst, solltest Du immer explizit nach dem suchen, was Du benutzt. Denn:
Zweitens: Was bedeutet (!port)? Warum testest Du diese Bedingung? Was testest Du da? Und was bedeutet (port==NULL)? Warum führst Du diesen Test durch?


Also das Problem von Thomas und Dir scheint hier zu sein, dass ihr ja nur den Codeausschnitt kennt, den ich hier gepostet habe, den Rest jedoch nicht:

Den Codeausschnitt für das Testen des Ports usw. hab ich aus einem Amiga-Bsp. Und ja, ich habe mich nicht darum gekümmert, was (!port) heisst, sondern den von mir noch notwendigen NULL-Vgl. drangehangen (man muss sich ja auch mal auf Code-Bsps. verlassen können, wenn die als solche angeboten werden!).

Den Test auf NULL mach ich, da mir die Methode, welche mir den Port liefert NULL zurückgibt, wenn der Port noch nicht existiert! Verständlich oder?

Zitat:
Wenn Du glaubst, dass es zwei verschiedene Dinge sein könnten, was für zwei Dinge sollten das sein? code ist doch kein Selbstzweck, also was ist der Zweck dieses Tests, den Du da hingeschrieben hast?

Wie gesagt: Der Test (!port) ist aus einem Programmierbeispiel übernommen. Der Test auf (port != NULL) ergibt sich aus meiner Wahl der Klassen und ihrer Methoden!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 21:45 Uhr

Reth
Posts: 1812
Nutzer
So mal zurück zum Kernproblem:

Ich habe mit obigem Code noch einen Test gemacht und nur einmal einen Menüpunkt angewählt (keine Mehrfachselektion o.ä.).
Das Ergebnis war, dass ewig viele andere Messages (Intuiticks) abgearbeitet wurden, bevor die Menupick-Message dran kam.

Das bedeutet aber, dass Intuition IntuiTick-Messagess in die Queue stellt, auch wenn die letzte dieser Messages noch nicht replied wurde! D.h. wiederum, ich müsste diese anders überspringen!

Eine Änderung des Codes weg von den ifs hin zu einem switch() brachte wie erwartet keine Verbesserung!

Ciao

[ - Antworten - Zitieren - Direktlink - ]

21.08.2006, 22:32 Uhr

Reth
Posts: 1812
Nutzer
Schein die Ursache gefunden zu haben.

Die äußere Schleife schliesst, wenn closing TRUE wird, was passiert, wenn der entsprechende Menüpunkt angewählt wurde (ist wie gesagt aus nem Bsp. übernommen).

Die innere Schleife arbeitet aber alle noch ausstehenden Messages ab (was man ja machen soll, nach allem, was man hier im Forum so drüber gelesen hat).

Stellt sich nur die Frage, ob ich die innere Schleife auch einfach abbrechen kann, wenn Closing auf TRUE ist, oder ob das Probleme mit Intuition etc. gibt?

Wenn ichs recht weiss hat Thomas (glaub) dazu in nem anderen Thread mal gesagt, dass das gefahrlos möglich sei (also die innere Schleife abbrechen), wenn man dann das Fenster usw. schliesst wird alles von Intiution aufgeräumt.

Mal testen...

Ciao

[ - Antworten - Zitieren - Direktlink - ]

22.08.2006, 00:04 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Reth:
So mal zurück zum Kernproblem:

Ich habe mit obigem Code noch einen Test gemacht und nur einmal einen Menüpunkt angewählt (keine Mehrfachselektion o.ä.).
Das Ergebnis war, dass ewig viele andere Messages (Intuiticks) abgearbeitet wurden, bevor die Menupick-Message dran kam.


Hmm, mit Menus habe ich micht noch nicht beschäftigt, aber während der Menuauswahl blockt Intuition mehr oder weniger das System, ggf. ändert das auch den Ablauf der Intuitick messages, dass dann doch mehrere Messages abgeschickt werden?

Teste mal dein Programm ohne Intuitick Messages, also die Erzeugung dieser beim erstellen des Fensters abschalten und probiere auch aus, ob die dauer des runterhaltens der Rechten Maustaste sich auf die Anzahl der Intuitick Messages auswirkt, d.h. ob mehr Messages anliegen wenn du dir mehr Zeit bei der Menuauswahl nimmst.

ggf. hast du MagicMenu installiert und das verursacht das Problem?

An deinem Code kann ich jedenfalls nichts finden was den fehler verursachen könnte.



[ Dieser Beitrag wurde von DariusBrewka am 22.08.2006 um 00:05 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.08.2006, 00:04 Uhr

DariusBrewka
Posts: 899
[Benutzer gesperrt]
Zitat:
Original von Reth:
Wenn ichs recht weiss hat Thomas (glaub) dazu in nem anderen Thread mal gesagt, dass das gefahrlos möglich sei (also die innere Schleife abbrechen), wenn man dann das Fenster usw. schliesst wird alles von Intiution aufgeräumt.


Das ist so Richtig, bei einem CloseWindow() entfernt Intuition Alle zum Fenster gehörenden Messages. Ist ja auch irgendwie logisch, was willst du z.B. nach einem IDCMP_CloseWindow machen? wenn dann ein MouseMove auftritt den Wunsch des Users das Programm zu beenden ignorieren?


[ - Antworten - Zitieren - Direktlink - ]

22.08.2006, 01:16 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von Reth:
Verständlich oder?

Nein, nicht im geringsten.
Code-Beispiele dienen dazu, dass man versucht, ihre Funktionsweise zu verstehen, genaugenommen, dass man die zugehörigen Dokumentationen/Artikel besser verstehen kann, keineswegs dazu, dass man sie hirnlos in irgendwelche andere Software kopiert.

Und wenn Du weißt, dass ein NULL-Test dazugehört und selber davon ausgehst, dass das code-Beispiel so korrekt ist, dass man es ohne den geringsten Anflug von Nachdenken kopieren kann, müsstest Du eigentlich auch davon ausgehen, dass schon längst ein NULL-Test im Beispiel enthalten ist.

Der überflüssige zweite Test fällt von der Performance her natürlich nicht in's Gewicht. Die dahinterstehende Haltung dagegen, eine Art Lernverweigerung gegenüber der Tätigkeit, mit der man sich aus freien Stücken beschäftigt, ist bedenklich. Wenn es Dir schon zuviel ist, Dich um das Verstehen solch trivialer Elemente der Programmiersprache zu bemühen, ist Fingerfarbenmalen vielleicht ein empfehlenswerteres Hobby als das Programmieren.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ Dieser Beitrag wurde von Holger am 22.08.2006 um 01:21 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.08.2006, 08:39 Uhr

Reth
Posts: 1812
Nutzer
Zitat:
Original von Holger:

Und wenn Du weißt, dass ein NULL-Test dazugehört und selber davon ausgehst, dass das code-Beispiel so korrekt ist, dass man es ohne den geringsten Anflug von Nachdenken kopieren kann, müsstest Du eigentlich auch davon ausgehen, dass schon längst ein NULL-Test im Beispiel enthalten ist.


Wie ich schon geschrieben habe! Der NULL-Test kommt dazu, weil ich in der Methode, die mir den Port übergibt (nicht im hier geposteten Code enthalten!) NULL zurückgebe, wenn noch nicht initialisiert wurde!

Zitat:
Der überflüssige zweite Test fällt von der Performance her natürlich nicht in's Gewicht. Die dahinterstehende Haltung dagegen, eine Art Lernverweigerung gegenüber der Tätigkeit, mit der man sich aus freien Stücken beschäftigt, ist bedenklich. Wenn es Dir schon zuviel ist, Dich um das Verstehen solch trivialer Elemente der Programmiersprache zu bemühen, ist Fingerfarbenmalen vielleicht ein empfehlenswerteres Hobby als das Programmieren.

Dann erklär doch mal! Wie ist das in C++ definiert? Werden dort alle Zeiger immer automatisch auf NULL initialisiert? Bei jedem Compiler?
Sicher? Das bedeutet, dass in C++ immer und auf jedem System und bei jedem Compiler:
C++ code:
int *i;


genau so angelegt wird:
C++ code:
int *i = NULL;


(nur dann ist für mich !port und port!=NULL dasselbe!)
Kann ich mir irgendwie nicht vorstellen, da NULL eine Typdefinition in den Amiga-Headern ist. Die kann auf anderen Systemen ganz anders ausfallen.

Statt ellenlanger Abschnitte ohne hilfreichen Hinweis, kannst Du doch kurz 2 Zeilen posten und mein Wissensdefizit in dieser Hinsicht ausmerzen, oder nicht?
Was bedeutet denn (!port) komplett ausgeschrieben in C++ bzw. bei der Programmierung auf dem Amiga?

Ciao

[ Dieser Beitrag wurde von Reth am 22.08.2006 um 08:40 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

22.08.2006, 08:58 Uhr

Reth
Posts: 1812
Nutzer
Zitat:
Original von Holger:
Wenn es Dir schon zuviel ist, Dich um das Verstehen solch trivialer Elemente der Programmiersprache zu bemühen, ist Fingerfarbenmalen vielleicht ein empfehlenswerteres Hobby als das Programmieren.


Für Dich scheint es relativ schwer zu sein andere Einstellungen als Deine zumindest zu akzeptieren (auch wenn man sie nicht gut findet).

Zum Punkt "triviales Element der Programmiersprache" siehe vorhergehender Post.

Wenn ich zu jeder Bibliothek, die ich z.T. täglich verwende erst deren Source analysieren und verstehen wollte, dann könnte ich nie irgendetwas anfangen zu programmieren!
Nach Deinem Verständnis müssten dann (fast) alle Softwareentwickler weltweit Fingerfarbenmaler werden und dürften nie wieder programmieren!

Man muss sich auf einige Dinge (die v.a. immer wieder gleich verwendet werden) auch verlassen können! (Oder programmierst Du Dir Dein if selbst, statt das entsprechende Konstrukt der Programmiersprache zu nehmen)?

Ciao

[ Dieser Beitrag wurde von Reth am 22.08.2006 um 08:59 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- 2 [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Nochmal Intuition Messages [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2022 by amiga-news.de - alle Rechte vorbehalten.
.