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

amiga-news.de Forum > Programmierung > Abbruch-Gadget mit Interrupt ? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

05.11.2006, 16:37 Uhr

uho
Posts: 114
Nutzer
Hallo,

dies ist mein erster Beitrag (und so ziemlich der erste Kontakt zu
anderen Amiga-Proggern.

Ich habe schon vor Jahren zwei Progs ins Aminet gestellt.
Und zwar:

misc/sci/Wator1_27.lha (graph. Sim. eines Öko-Systems)

gfx/misc/HideIt_1.20.lha (einfaches Stegano-Prog)

Konstruktive Kritik würde mich sehr freuen...


Aber nun zum Thema:

Wator braucht die volle Rechenzeit. Das verträgt sich aber nicht
mit einem schnell reagierenden Abbruch-Gadget.

Aufgrund des verschachtelten Aufbaus der Hauptroutine habe ich nur
folgende Möglichkeiten:

Endweder ich rufe folgenden Code nach jedem Individuum auf -
also auf meinem 060/50 ca. 7000x je Sekunde.
Folge: 30% Leistungseinbuße im Modus "schnell"

Oder (so ist es jetzt): Der Code wird nur einmal pro Simulations-
tag aufgerufen.
Folge: Dutzende Sekunden Reaktionszeit im Modus "langsam".


Hier der Code:

while (intuimsg = GT_GetIMsg(Window->UserPort))
{
msgclass=intuimsg->Class;
GT_ReplyIMsg(intuimsg);
};
if (msgclass==GADGETUP)
{
i++; // für korrekte Statistik
break; // Verlassen der Hauptschleife
};

(Mist. Die Web-Seite löscht die Leerzeichen (Einrückungen) !! )

Mir würde ja eine Lösung vorschweben, in der das Betätigen des
Gadgets einen Interrupt auslöst, der einen Sprung direkt hinter die
Hauptschleife veranlasst.
Damit wäre die verschwendete Rechenzeit bei Null. Leider weiß ich
nicht, wie man so etwas programmiert.

Als einziges Prog mit ähnlicher Problemstellung (und Lösung !)
kenne ich "Mand2000". Leider hat der Autor damals nicht geantwortet.



In der Hoffnung auf Ideen & Anregungen

uho

P.S.: Wer Photogenics 1.2b nicht besitzt, dem kann ich gerne ein
Bild zum Testen mit HideIt schicken...

[ - Antworten - Zitieren - Direktlink - ]

05.11.2006, 17:39 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von uho:
(Mist. Die Web-Seite löscht die Leerzeichen (Einrückungen) !! )

Dafür gibt es in diesem Forum das
code:
Tag.
Du schreibt also
[code]
     while (intuimsg = GT_GetIMsg(Window->UserPort))
...

und das Ergebnis sieht so aus:
code:
while (intuimsg = GT_GetIMsg(Window->UserPort))
        {
            msgclass=intuimsg->Class;
            GT_ReplyIMsg(intuimsg);
        };
        if (msgclass==GADGETUP)
        {
            i++;     // für korrekte Statistik 
            break;   // Verlassen der Hauptschleife
        };

als Bonbon kannst Du am Anfang statt [code] auch
C code:
schreiben, dann sieht das Ergebnis so aus:
[code language="C"]
     while (intuimsg = GT_GetIMsg(Window->UserPort))
        {
            msgclass=intuimsg->Class;
            GT_ReplyIMsg(intuimsg);
        };
        if (msgclass==GADGETUP)
        {
            i++;     // für korrekte Statistik 
            break;   // Verlassen der Hauptschleife
        };

Zitat:
Mir würde ja eine Lösung vorschweben, in der das Betätigen des
Gadgets einen Interrupt auslöst, der einen Sprung direkt hinter die
Hauptschleife veranlasst.

Window->UserPort ist ein MessagePort und als solcher auch mit einem Signal versehen. Man kann Software-Interrupts durch solche Signale auslösen lassen, allerdings sind die Auswirkungen auf normalen C-Code nicht unbedingt exakt vorhersehbar. Deshalb würde ich davon abraten.

Stattdessen kannst Du mit der Funktion Signal() überprüfen, ob das zugehörige Signal eingetroffen ist. Das geht etwas schneller, als eine Abfrage des MessagePorts. Dafür muss man allerdings berücksichtigen, dass ein Signal aufgrund der Nebenläufigkeit mehrere oder keine Messages beinhalten kann.

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

[ - Antworten - Zitieren - Direktlink - ]

05.11.2006, 17:51 Uhr

thomas
Posts: 7716
Nutzer

Interrupt ist wohl nicht möglich. Aber du könntest die GUI-Abfrage in einem eigenen Task starten. Das läßt sich mit CreateNewProcTags recht einfach bewerkstelligen. Die GUI-Task kann dann sofort auf das Klicken reagieren und z.B. den Mauszeiger auf Busy setzen, um dem Benutzer mitzuteilen, daß die Eingabe registriert wurde. Außerdem könntest du eine globale Variable setzen, die anzeigt, daß das Gadget angeklickt wurde. Die Abfrage der Variablen sollte deinen Code nur unwesentlich verlangsamen, aber die Reaktionszeit deutlich verkürzen.

Gruß Thomas

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

[ - Antworten - Zitieren - Direktlink - ]

13.11.2006, 23:24 Uhr

uho
Posts: 114
Nutzer
Hallo,

habe 'mal auf "Beitrag schreiben" geklickt. K.A., ob das so gedacht
ist, oder ob man lieber bei der jeweiligen Antwort auch "Antworten"
klicken soll. Ich nehme an, daß letzteres nur einer lesen kann.

Kann man eigtl. auch Bilder (z.B. erklärende Screenshots) einfügen ?


Ansonsten erstmal danke für die Hilfe !

Leider ist es ja auch nach Tagen bei nur zwei Antworten geblieben.
Vielleicht war ja die Frage zu schwer ?

Naja. Auch zu meinen Progs kam leider keine einzige Rückmeldung.
Schade...


Der Tip mit [code] klappt ausgezeichtnet. Danke.

Die Variante mit [code language="C"] dagegen nicht (habe IB).



Einen separaten Task zu starten ist eine interessante Idee.
Kann dieser dann auch wirklich den Mauszeiger oder globale
Variablen meines Hauptasks verändern ?



In Zukunft muß ich wohl erst die Beiträge irgendwie "vorschreiben" -
sonst kostet mich das hier ein Vermögen und man vergißt immer die
Hälfte...


Erstmal soviel

uho


P.S.: Kommt einer von Euch am Samstag nach Nürnberg ? Da könnte man
dann direkt fachsimpeln !

[ - Antworten - Zitieren - Direktlink - ]

14.11.2006, 16:03 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von uho:
Hallo,

habe 'mal auf "Beitrag schreiben" geklickt. K.A., ob das so gedacht
ist, oder ob man lieber bei der jeweiligen Antwort auch "Antworten"
klicken soll. Ich nehme an, daß letzteres nur einer lesen kann.

Nein, das wäre ja furchtbar. Jeder kann immer alle Beiträge lesen. Der Unterschied ist der: wenn Du auf "Beitrag schreiben" klickst, siehst Du über dem Texteingabefeld den ersten Beitrag zum nachlesen, wenn Du auf "Antworten" klickst, siehst Du eben den Beitrag, auf den Du antwortest, über dem Eingabefeld. Außerdem wird "@Name" schonmal am Anfang des Textes eingefügt. Das kannst Du dann aber beliebig editieren.
Wenn Du auf "Zitieren" klickst, siehst Du wie bei "Antworten" den Text, außerdem wird dieser als Zitat, so wie jetzt Deiner bei mir, eingefügt. Dadrin kann man dann aber auch editieren, um ihn z.B. zu kürzen oder stückweise zu beantworten (wie ich das gerade mache).
Zitat:
Kann man eigtl. auch Bilder (z.B. erklärende Screenshots) einfügen ?
Ja, in dem Du Bild: url eingibst. Hier findest Du die weiteren Möglichkeiten des Forums.
Zitat:
Leider ist es ja auch nach Tagen bei nur zwei Antworten geblieben.
Vielleicht war ja die Frage zu schwer ?

Du musst etwas konkreter werden, dann können wir auch konkretere Vorschläge machen. So ist das Thema zu komplex, und auch alles allgemeine schon gesagt gewesen, um noch mehr Antworten zu erwarten.
Zitat:
Einen separaten Task zu starten ist eine interessante Idee.
Kann dieser dann auch wirklich den Mauszeiger oder globale
Variablen meines Hauptasks verändern ?

Klar, allerdings gibt es dabei einige Fallen. Wichtig ist, dass man die Tasks richtig synchronisiert. In C99 und C++ gibt es außerdem das Schlüsselwort volatile mit dem man solche von mehreren Tasks gemeinsam genutzten Variablen kennzeichnen sollte, um Probleme bei höheren Optimierungsstufen zu vermeiden.
Zitat:
In Zukunft muß ich wohl erst die Beiträge irgendwie "vorschreiben" -
sonst kostet mich das hier ein Vermögen und man vergißt immer die
Hälfte...

Das kann helfen ;)
Zitat:
P.S.: Kommt einer von Euch am Samstag nach Nürnberg ? Da könnte man
dann direkt fachsimpeln !

Ich leider nicht.

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

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Abbruch-Gadget mit Interrupt ? [ - Suche - Neue Beiträge - Registrieren - Login - ]


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