![]() |
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:Dafür gibt es in diesem Forum das code:und das Ergebnis sieht so aus:Tag. Du schreibt also [code] while (intuimsg = GT_GetIMsg(Window->UserPort)) ... code:als Bonbon kannst Du am Anfang statt [code] auchwhile (intuimsg = GT_GetIMsg(Window->UserPort)) { msgclass=intuimsg->Class; GT_ReplyIMsg(intuimsg); }; if (msgclass==GADGETUP) { i++; // für korrekte Statistik break; // Verlassen der Hauptschleife }; 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: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: 7719 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: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:Ja, in dem Du Bild: url eingibst. Hier findest Du die weiteren Möglichkeiten des Forums. Zitat: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: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:Das kann helfen ![]() Zitat: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-2025 by amiga-news.de - alle Rechte vorbehalten. |
![]() |