![]() |
ENGLISH VERSION |
|
![]() |
Links | | | Forum | | | Kommentare | | | News melden |
![]() |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
![]() |
amiga-news.de Forum > Programmierung > Fragen zu Intuition-Messages | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
1 -2- | [ - Beitrag schreiben - ] |
12.07.2006, 00:53 Uhr Holger Posts: 8116 Nutzer |
Zitat:Ein Textdokument, selbst mit styles, zu kopieren, ist kein großer Akt. Wenn das Dokument dagegen, wie in den meisten Fällen, über das Grafik-Druck-API ausgegeben wird, existiert ohnehin eine Kopie, nämlich das gerenderte Dokument. Da kann man in dem Quell-Dokument durchaus weiterarbeiten. Dabei ist das Rendern eines Dokuments i.A. ohne externe Resourcen möglich, das Dokument und alle verwendeten fonts + images sind ja im Ram, zumindest bei wysiwyg editoren. Erst das Drucken selbst verwendet externe Resourcen und dauert unberechenbar lange. Selbst, wenn man das alles nicht macht, kann man ja dieses eine Dokument für den Lesezugriff locken, dann kann man es drucken und der User gleichzeitig drin rumscrollen oder ein _anderes_ Dokument währenddessen bearbeiten... Zitat:Nur waren Smart-Refresh Fenster damals auch wirklich schneller und 515kB/1MB Chip-RAM für die vorhandenen Grafik-Modi eine Menge Holz. Für einen 24Bit-Grafikmodus dagegen Backbuffer auf einer 2MB/4MB Grafikkarte zu reservieren (oder gar Rücktransfers in Kauf zu nehmen) für einen marginalen Gewinn, oder gar einen Verlust von Performance ist dagegen etwas ganz anderes. Zitat:Ganz einfach: zwei Aktionen 1.) Prüfe Vorbedingungen 2.) Schreibe Daten. Dazwischen können UI-Events bearbeitet werden. Das AmigaOS bietet sogar die nötigen Funktionen an, um Requester darzustellen UND weitere Events zu verarbeiten. Ist aber logischerweise komplizierter als den Task zu blockieren... Zitat:Erste Aktion aufgrund des Fehlers abbrechen und nach der User-Aktion abhängig von der User-Aktion eine neue Aktion starten. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.07.2006, 01:00 Uhr Holger Posts: 8116 Nutzer |
Zitat: Eine pragmatische Herangehensweise ist mit Sicherheit sinnvoll, insb. wenn es darum geht, überhaupt erst einmal Software zur Erfüllung einer bestimmten Aufgabe zu haben. Es schadet aber nichts, wenn man dabei den Idealfall, bzw. die in der aktuellen Implementierung vorhandenen Defizite im Hinterkopf behält. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
12.07.2006, 02:19 Uhr whose Posts: 2156 Nutzer |
Zitat: Hm, das dachte ich mir... die Frage ist halt, ob der Berechnungstask unbedingt von den "mehreren Möglichkeiten" im Fehlerfall wissen muß. Im Grunde gibt es da nicht allzu viel, was der Hintergrund-Task wissen muß, um wie gewünscht zu arbeiten. Um die von ihm verarbeiteten Daten kümmert er sich selbst, er weiß, wo die Eingabedaten zu finden sind und er weiß, was er tun muß, um eine Verarbeitung sauber abzubrechen. Um den Rest kümmert sich der GUI-Task, z.B. die Information zu besorgen, an welcher Stelle der Berechnungen der Hintergrund-Task fortfahren soll etc. Diese Informationen gehören aber streng genommen schon zu den Eingabedaten. Das Prinzip funktioniert eigentlich bei jeder Gelegenheit. Wenn der Hintergrund-Task wesentlich mehr wissen "muß", stimmt etwas mit dem Design nicht. Das ist jetzt aber nur meine persönliche Meinung. Grüße -- --- ![]() ![]() [ - Antworten - Zitieren - Direktlink - ] |
12.07.2006, 22:09 Uhr NoImag Posts: 1050 Nutzer |
Zitat: Natürlich nicht. Zitat: Wenn ich das Dokument erst komplett rendere bevor ich mit dem Drucken beginne, dann geht mir mit Sicherheit das RAM aus. Hochaufgelöste Grafik braucht viel RAM. Nein, da ist das Erstellen einer Kopie, die dann zum Drucken herangezogen wird, wahrscheinlich weniger RAM-intensiv. Zitat: Vielleicht ist mir der Begriff rendern nicht richtig bekannt. Ich hätte jetzt gesagt, das Rendern ist das, was RAM verschlingt, nicht das Drucken. Zitat: In meinem Fall ist das nicht so einfach, weil Verbindungen zwischen den Dokumenten bestehen, die dazu führen können, dass eine Operation in Dokument B nicht möglich ist, weil Dokument A gerade nur gelesen werden darf. Das ist zwar machbar, aber ich befürchte, das könnte unbedarfte User überfordern. Zitat: Im Grunde mache ich das auch nicht anders, aber ich rufe nicht die beiden Aktionen im UI-Bereich auf sondern nur eine Funktion, die selbst erstmal eine Funktion zum Prüfen der Vorbedingungen aufruft, dann eventuell rückfragt und anschließend die Funktion zum Schreiben der Daten aufruft. Aber das passiert eben bereits eine Ebene tiefer. Zitat: Also heißt das, einige Arbeiten doppelt ablaufen lassen, damit der Code aufgeräumter ist? Tschüß [ - Antworten - Zitieren - Direktlink - ] |
12.07.2006, 22:14 Uhr NoImag Posts: 1050 Nutzer |
Zitat: Das ist mit Sicherheit richtig. Als ich vor 17 Jahren angefangen habe, habe ich mich immer für die schnellste Lösung entschieden, ohne an die Zukunft zu denken. Dies habe ich dann ein paar Jahre später ein paar mal bereut. In der letzten Zeit war ich aber meistens überrascht, wie einfach Verbesserungen möglich waren. Tschüß [ - Antworten - Zitieren - Direktlink - ] |
12.07.2006, 22:20 Uhr NoImag Posts: 1050 Nutzer |
Zitat: Wenn ich Daten aus dem Clipboard übernehme und die Daten nicht mehr vollständig ins Dokument passen, weil die maximale Zeilenzahl überschritten wird (nein, es handelt sich nicht um Text, eine maximale Zeilenzahl lässt sich nicht vermeiden) gibt es die Möglichkeit, entweder die Aktion ganz bleiben zu lassen oder das zu übernehmen, was noch passt. Die Informationen kommen also aus dem Clipboard. Mit dem GUI-Task hat das doch nichts zu tun. Diese Information muss sich der Hintergrund-Task schon selbst holen. Oder nicht? Tschüß [ - Antworten - Zitieren - Direktlink - ] |
12.07.2006, 23:46 Uhr whose Posts: 2156 Nutzer |
Zitat: Nein, eigentlich nicht. Die Informationen über z.B. die Datenmenge sollte der GUI-Task bereitstellen, dann kann der Bearbeitungstask ohne großen Aufwand entscheiden, ob das paßt oder nicht und entsprechende "Rückmeldung" (z.B. in einem gemeinsam genutzten Datenbereich in Form einer Struktur) geben, evtl. in Form der "gerade noch passenden Zeilen", was den Vorteil hätte, daß sich der Benutzer den für ihn wirklich wichtigen Teil via GUI-Task auswählen und dann laden könnte, oder schlicht "Geht nicht" als Flag. Alles weitere (will der Benutzer nur den in den Speicher passenden Teil laden oder die Aktion ganz abblasen?) sollte der GUI-Task "entscheiden". Der Bearbeitungs-Task bekommt dann nur die Information, daß er die Aktion z.B. wiederholen soll, aber mit begrenzter Datenmenge (Zeilen, Zeichen, was weiß ich, je nach dem, was der Aufgabe dienlicher ist), oder eben, daß das Ganze "gestrichen" wurde und er der Dinge harren soll, die da kommen. Wenn man sich dazu gezwungen sieht, um des Benutzers Willen mit mehreren Tasks zu arbeiten, sollte man solche Fälle (Angabe von Teilmengen der zu bearbeitenden Daten, Abbrüche mit Verwerfen der bisher bearbeiteten Daten, Abbrüche mit Erhalt der bisher bearbeiteten Daten, Bearbeitung ab einer bestimmten Position bis zu einer bestimmten Position in den Ausgangsdaten etc.) auf jeden Fall vorsehen. Es ist zwar anfangs eine Menge Arbeit, die da zu erledigen ist, aber spätestens dann, wenn solche Funktionalität vom Anwender gefordert wird, hat man gewonnen. Nebenbei wird man im Laufe der Zeit feststellen, daß die Aufgaben der Berechnungstasks meist gleich bleiben (recht unabhängig von der eigentlichen Aufgabe, seis Bildbearbeitung oder Textmanipulation oder sonstwas). Man kann diese Designs sehr häufig wiederverwenden. Grüße -- --- ![]() ![]() [ - Antworten - Zitieren - Direktlink - ] |
13.07.2006, 13:25 Uhr Holger Posts: 8116 Nutzer |
Zitat: Du willst also den User fragen, was passieren soll, wenn die Daten nicht passen? Dann sind das zwei Aktionen, insert_if_it_fits() und insert_cut_off(). insert_if_it_fits() wird per default benutzt und triggert bei Nichtpassen das Öffnen eines Dialogs, dessen erste Optionen insert_cut_off() triggert (das macht der UI-Task) und dessen zweite ("Abbruch") ja eh nur den Dialog schließt (das kann der UI-Task ganz alleine. Zwischen diesen zwei Aktionen besteht keine code-Doppelung, es sei denn, Du machst welche. Denn wozu gibt es Funktionen/Unterprogramme? Die zwei Aktionen sollten für sich natürlich nur das enthalten, was unterschiedlich ist. insert_if_it_fits() { if(fits()) doTheInsert(); else openDialog(&insert_cut_off, NULL); } insert_cut_off() { cutOff(); doTheInsert(); } Von der Logik her sind beide Aktionen völlig unterschiedlich. Das, was gleich ist, doTheInsert(), wird natürlich ausgelagert. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
15.07.2006, 23:50 Uhr NoImag Posts: 1050 Nutzer |
Zitat: Du meinst, der GUI-Task sollte das Clipboard öffnen, Datentyp und Menge auslesen, Clipboard wieder schließen und diese Eingabedaten an den Bearbeitungstask weitergeben. Der Bearbeitungs-Task testet dann, ob das passt und gibt eventuell einen Fehler dem GUI-Task zurück. Wenn es passt oder der GUI-Task dem Bearbeitungstask mitteilt, nur die passenden Daten zu verwenden, dann öffnet der Bearbeitungstask wieder das Clipboard, übernimmt die Daten und schließt das Clipboard wieder? Der GUI-Task muss die Eingabedaten ja selbst erst ermitteln und zwar aus derselben Quelle, in der sich später der Bearbeitungstask bedient. Da die Eingabedaten ja externe Daten sind (aus dem Clipboard) würde ich dies als Aufgabe des Bearbeitsungstasks ansehen. Außerdem muss das Öffnen und Schließen des Clipboards und der Test des Datentyps zweimal erfolgen. Hinzu kommt, dass in einem Multitaskingsystem sich der Clipboardinhalt ja zwischenzeitlich ändern könnte. Oder soll der GUI-Task das Öffnen und Schließen des Clipboards übernehmen und der Bearbeitungstask erhält nur den Pointer auf die IOClipReq-Struktur? Tschüß [ - Antworten - Zitieren - Direktlink - ] |
15.07.2006, 23:52 Uhr NoImag Posts: 1050 Nutzer |
Zitat: Auch bei deiner Antwort bleibt meine Frage zum Umgang mit dem Clipboard. Soll das Öffnen und Schließen des Clipboards außerhalb von insert_if_it_fits() und insert_cut_off() erfolgen? Ansonsten gibt es schon eine Code-Doppelung in fits() und doTheInsert() (siehe auch meine Antwort auf whose). Tschüß [ - Antworten - Zitieren - Direktlink - ] |
16.07.2006, 01:24 Uhr whose Posts: 2156 Nutzer |
Zitat: Das wäre der sinnvollste Weg. Der GUI-Task sorgt für die Verbindungen "nach außen", der Berechnungstask kümmert sich ausschließlich um die Daten (die er vom GUI-Task bekommt, in Form eines Zeigers auf einen gemeinsam genutzten Speicherbereich). Ob der Berechnungstask nun (quasi nebenbei) die Daten selbst lädt oder auch das vom GUI-Task erledigt wird, ist mehr eine "Frage des Geschmacks". Möchtest Du dem User die Möglichkeit geben, auch während eines voraussichtlich länger dauernden Ladevorgangs weiterarbeiten zu können, wäre auch das eigentliche Laden der Daten Sache des Berechnungstasks. Eines solltest Du dabei aber überlegen: Ob sich der (doch erhöhte) Aufwand in Deinem Fall rechnet. Wenn Du Dir sicher bist, daß da keine langwierigen Berechnungen oder Ladevorgänge lauern, dann muß es nicht unbedingt für alles und jedes einen Extra-Task geben. Genauso, wenn Du Dir sicher bist, daß der Benutzer einen bestimmten Vorgang nicht abbrechen will oder dadurch, daß ein Vorgang nicht abgebrochen werden kann, keine Nachteile in der Benutzbarkeit Deines Programms sieht. Das Beispiel YAM war eigentlich schon ein Extrembeispiel, da dort der scheinbar mögliche, aber doch nicht wirklich mögliche Abbruch das Programm im schlimmsten Fall "hängen" lies. Der Benutzer konnte in einem solchen Fall dazu gezwungen sein, einen Reset auszulösen, was evtl. einen Datenverlust nach sich zog (mir selbst schon passiert, als es bei GMX kleinere Probleme mit POP3 gab). Grüße -- --- ![]() ![]() [ - Antworten - Zitieren - Direktlink - ] |
16.07.2006, 15:55 Uhr Holger Posts: 8116 Nutzer |
Zitat: Meine Güte, wie schräg um die Ecke kann man eigentlich denken? Ich habe mich noch nie so intensiv mit dieser Aufgabe befaßt, deshalb verzeih mir, daß ich mich von Dir zuerst auf's Glatteis führen ließ. Ist natürlich vollkommener Quatsch, die Akquise des Clipboard-Inhalts und das Einfügen in das Dokument miteinander zu vermischen. Trennt man beide Aktionen, gibt es auch überhaupt kein Problem und keine Code-Doppelung: 1.) Clipboard Inhalt lesen (bevorzugt im eigenenen Task) 2.) Platz im Dokument überprüfen, bei unzureichenden Platz nachfragen (im GUI-Task) 3.) Einfügen (kann im eigenen Task aufgeführt werden) Anzumerken sei noch, daß 1) kaum ein Programm als eigenen Task macht, obwohl prinzipiell CLIPS: als Assign auch auf ein beliebiges anderes Laufwerk als die Ram-Disk gelegt werden kann. Wenn man es im eigenen Task macht, müßte natürlich das Dokument + Einfügeposition blockiert und ein Timeout für die Leseoperation eingerichtet werden. 3) verwendet keine externen Resource und kann deshalb auch im UI-Task ausgeführt werden, da der Aufwand im voraus kalkuliert werden kann. Wenn die Einfügeoperation das Belegen von zusätzlichen Speicher beinhaltet, müßte ein sauber geschriebenes Programm theoretisch auch das auslagern, allerdings gehört auch das zu den Dingen, die man zwar in Richtlinien, aber nicht in der Praxis wiederfindet... mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
18.07.2006, 22:01 Uhr NoImag Posts: 1050 Nutzer |
@whose: Danke für die Erläuterungen. Tschüß [ - Antworten - Zitieren - Direktlink - ] |
18.07.2006, 22:04 Uhr NoImag Posts: 1050 Nutzer |
Zitat: Natürlich verzeihe ich dir. Es lag auch nicht in meiner Absicht, dich auf's Glatteis zu führen. Ich wollte nur verstehen, wie die praktische Umsetzung auszusehen hat und habe da ein Beispiel aus meinem Projekt gewählt, bei dem mir nicht klar war, wie eine praktische Umsetzung aussehen könnte. Zitat: Der Gedanke, dass es eine gute Idee sein könnte, das Auslesen des Clipboards und das Einfügen zu trennen, ist mir nicht gekommen, weil dazu erst eine Kopie des Clipboard-Inhalts angelegt werden muss, was zusätzlichen Speicher erfordert. Auch dir vielen Dank für die Erläuterungen. Tschüß [ - Antworten - Zitieren - Direktlink - ] |
18.07.2006, 23:19 Uhr whose Posts: 2156 Nutzer |
Zitat: Wieso muß? Dank IFF ist es doch relativ einfach, die absolute Menge an enthaltenen Daten festzustellen. Im RKM Devices steht als Warnung nur, daß man sich beim Laden/Schreiben sputen sollte, da das Clipboard nicht für andere Programme zur Verfügung steht, solange darauf zugegriffen wird. Ich wage jetzt einfach mal zu behaupten, daß die notwendigen IFF-Header sehr schnell geparst sind, so daß das eigentliche Laden ebenfalls sehr schnell begonnen werden kann, unabhängig davon, ob alles oder nur Teile geladen werden. Das einzige Problem stellt die Rückfrage beim Benutzer dar, die kann natürlich je nach Persönlichkeit des Benutzers ziemlich lange dauern ![]() Andererseits gibts meist auch nur einen Benutzer vor der Tastatur, so daß die Wahrscheinlichkeit sehr gering ist, daß da zwei Clipboard-Zugriffe gleichzeitig stattfinden sollen ![]() Für den Fall, daß der Benutzer doch "umschaltet" und woanders was ins Clipboard zu kopieren versucht, empfehle ich einen deutlichen Hinweis in der Dokumentation, daß Clipboard-Zugriffe bei einem Speicherproblem und der entsprechenden Rückfrage blockiert werden, bis der User eine Entscheidung getroffen hat. Das kann man wahlweise auch im Rückfrage-Requester noch einmal deutlich machen, damit es da kein Vertun gibt. Das gleiche Problem (Clipboard-Blockade) hast Du aber auch, wenn Du nur mit einem Task arbeitest und eine Rückfrage beim Benutzer startest, ob der Clipboard-Inhalt teilweise oder gar nicht geladen werden soll. Das hat wenig mit dem internen Aufbau Deines Programms zu tun, sondern liegt in der Natur des Clipboards. Da mußt Du für Dich entscheiden, ob Du die Clipboard-Blockade "riskieren" oder den Benutzer "bevormunden" willst (sprich: das Laden bei Speicherproblemen/teilweises Laden schlicht nicht zulassen). Oder halt doch den ganzen Krempel in den Speicher kopieren und von da aus weitermachen. So oder so: Du kannst sowohl das eine als auch das andere mit einem oder mehreren Tasks erledigen. Bei letzterem ist ein vorzeitiger Abbruch einer größeren Ladeaktion aber mit weniger Aufwand realisierbar. Es soll ja Leute geben, die mehrere MB ins Clipboard schieben, dann kann ein Ladevorgang aus diesem schon mal ein wenig dauern ![]() Grüße -- --- ![]() ![]() [ - Antworten - Zitieren - Direktlink - ] |
19.07.2006, 12:31 Uhr Holger Posts: 8116 Nutzer |
Zitat: Das kommt darauf an, wie man die Datenstrukturen angelegt hat. Wenn Du etwas einfügen willst, muß genügend Speicher dafür im Dokument vorhanden sein, d.h. Du hast den Speicher bereits. Die Frage ist nur, ob es in Deinen Strukturen möglich ist, Daten in diesen Speicherbereich zu laden, ohne sie automatisch aktiv werden zu lassen. Einen Lock mußt Du sowieso haben, weil das Dokument ja nicht zwischenzeitlich verändert werden darf. Wenn dann der Platz ausreicht oder die Rückfrage positiv beantwortet wurde, müssen die Daten nur noch aktiv werden, Pointer umbiegen o.ä. Wenn die Struktur, wie von Dir angedeutet, statisch ist und keine solchen Verweise besitzt, kann man auch einfach immer einfügen und, wenn der Platz nicht reicht und der Benutzer das unvollständige Einfügen ablehnt, die Operation rückgängig machen. Eine Schreiblock auf das Dokument muß man, wie schon gesagt, sowieso die ganze Zeit über halten. Und bei statischen Strukturen ist das Einlesen und wieder Verwerfen normalerweise auch keine aufwendige Operation. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
19.07.2006, 21:41 Uhr NoImag Posts: 1050 Nutzer |
Zitat: Wenn ich Holger richtig verstanden habe, dann geht es doch gerade darum erst den Clipoboard-Inhalt zu laden, dann bei Bedarf beim User rückzufragen und dann die Daten einzusetzen. Wenn ich als erstes den Clipboard-Inhalt lade, dann muss ich ihn auch irgendwo hintun. ![]() Tschüß [ - Antworten - Zitieren - Direktlink - ] |
19.07.2006, 21:58 Uhr NoImag Posts: 1050 Nutzer |
Zitat: Wenn die daten nicht in das Dokument passen, dann wird das Dokument automatisch erweitert (d.h. entsprechend Speicher angefordert), dies erfolgt vor dem eigentlichen Einsetzen, d.h. sobald klar ist, wieviel eingesetzt wird. Ein Problem gibt es nur dann, wenn a) der Speicher nicht reicht oder b) die maximal theoretisch mögliche Dokumentgröße überschritten wird, weil in diesen Fällen beim User eine Rückfrage sinnvoll sein kann. Zitat: Das wäre machbar. Es würde dann praktisch das Einsetzen wie bisher ablaufen, nur vor der Rückfrage und nicht danach. Zitat: Mit dem Umbiegen eines Pointers ist es nicht getan. Dazu sind die Möglichkeiten zu komplex (wahlweise nur Einsetzen einzelner Objektattribute statt aller) und das Dokument zu komplex aufgebaut (zu viele Pointer). Zitat: Auch wenn ich die Struktur nicht als statisch bezeichnen würde, müsste es wohl so ablaufen. Allerdings gefällt mir nicht, die Operation erst vollständig (oder so vollständig wie möglich) auszuführen und wenn der User damit nicht einverstanden ist die Operation wieder Rückgängig zu machen (was kein Problem ist, Undo ist implementiert). Schließlich weiß das Programm bereits frühzeitig, ob es ein Problem gibt. Sollte der Clipboard-Inhalt groß sein (was ja möglich ist, wie whose auch geschrieben hat), stellt diese Lösung die Geduld des Users unnötig auf die Probe. Tschüß [ - Antworten - Zitieren - Direktlink - ] |
20.07.2006, 00:53 Uhr whose Posts: 2156 Nutzer |
Zitat: Hm, ja das stimmt schon... wenn man den kompletten Inhalt lädt, wirds problematisch. Nur fällt mir dazu ein, daß es technisch ja kein großes Problem ist, den Clipboard-Inhalt teilweise zu laden. Dies kann man ja byteweise angeben. Technisch würde das bedeuten, daß man den IFF-Header (oder die Header, das "daran lang hangeln" ist ja nicht gar so aufwändig) als erstes lädt und die tatsächlich vorhandene Nutzdatenmenge ermittelt. Sobald man das hat, ist die Sache mit der zu treffenden Entscheidung bei Speichermangel kein großer Akt mehr. Das einzige Problem bleibt in der Blockierung des Clipboards, solange sich der Benutzer nicht entschieden hat. Bescheidene Situation irgendwie... Grüße -- --- ![]() ![]() [ - Antworten - Zitieren - Direktlink - ] |
20.07.2006, 22:07 Uhr NoImag Posts: 1050 Nutzer |
Zitat: Im Prinzip läuft es zur Zeit läuft so. Halt alles im selben Task. Zitat: Ich fürchte, dieses Problem lässt sich tatsächlich nur durch vorheriges Laden aller benötigten Daten lösen. Allerdings halte ich es für unwahrscheinlich, dass der User zur selben Zeit in einem anderen Programm etwas in das Clipboard schreiben will. Außerdem sollte er dann ja darauf aufmerksam gemacht werden, dass das Clipboard noch blockiert ist. Das Clipboard zu blockieren halte ich jedenfalls für besser, als dem User nach der Beantwortung der Frage mitteilen zu müssen, dass die Aktion nicht mehr ausgeführt werden kann, weil sich zwischenzeitlich der Clipboard-Inhalt geändert hat. Tschüß [ - Antworten - Zitieren - Direktlink - ] |
20.07.2006, 22:44 Uhr whose Posts: 2156 Nutzer |
Zitat: Da hast Du wohl Recht. Auch meiner Meinung nach ist eine Blockade mit Warnung auf jeden Fall die bessere Lösung. Grüße -- --- ![]() ![]() [ - Antworten - Zitieren - Direktlink - ] |
21.07.2006, 10:00 Uhr Reth Posts: 1860 Nutzer |
Jetzt hab ich nochmal ne Frage zu dem Thema (hoffentlich wird die überhaupt noch gelesen, da die Disskussion ja schon ne Weile zu nem speziellen Unterthema (bzw. schon OT?) läuft: Hab bei der Konstruktion meiner Klassen ein kleines Problem, da die Klasse welche die Endlosschleife mit dem Messageempfang macht quasi von aussen mitgeteilt bekommt, wann sie sich beenden soll. Das ist erstmal kein Problem, aber ich weiss nicht wie Intuition reagiert, wenn noch nicht alle Messages abgearbeitet sind? Im Prinzip läuft das so: C++ code:while (TRUE) { Wait(for signal); while (noch message da) { bearbeiteMessage(); // hier erfolgen z.B. Aufrufe von Methoden anderer Klassen holeNächsteMessage(); } } Im Falle des Beendens des Programmes würde momentan einfach nicht mehr in die innere While-Schleife zurückgekehrt werden, sondern die Methode zum Beenden der Klasse gerufen und dort natürlich auch alle Resourcen freigegeben (also Window, Screen, Libs etc.). Geht das so, oder bringt das Intuition durcheinander, wenn nicht alle Messages abgearbeitet (und damit replied) wurden und dann die Quellen einfach geschlossen werden? Danke schon mal Ciao BTW: Gibt es hier nen Stylesheet (oder mehrere) für Quellcodes? Es funktioniert ja nicht mal als Leerzeichen! [ Dieser Beitrag wurde von Reth am 21.07.2006 um 10:30 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
21.07.2006, 10:21 Uhr thomas Posts: 7721 Nutzer |
CloseWindow() räumt auf, du brauchst dir keine Sorgen zu machen. Formatierungen werden in der Hilfe beschrieben. Gruß Thomas -- Email: thomas-rapp@web.de Home: thomas-rapp.homepage.t-online.de/ [ - Antworten - Zitieren - Direktlink - ] |
21.07.2006, 10:30 Uhr Reth Posts: 1860 Nutzer |
@thomas: Danke Dir! Dann kann ich ja unbesorgt nicht in meine Schleife zurückkehren! ![]() [ - Antworten - Zitieren - Direktlink - ] |
21.07.2006, 10:37 Uhr whose Posts: 2156 Nutzer |
@Reth: Aufpassen mußt Du nur, wenn Du mehrere Fenster mit einem geteilten Messageport benutzt. Mehr dazu findest Du im RKM "Libraries", Abteilung "Intuition Library". Grüße -- --- ![]() ![]() [ - Antworten - Zitieren - Direktlink - ] |
21.07.2006, 10:47 Uhr Reth Posts: 1860 Nutzer |
@whose: Hab ich nicht vor (aber wer weiss...). Wusste gar nicht, dass man den UserPort eines Intuition-Fensters selbst setzen darf!? [ - Antworten - Zitieren - Direktlink - ] |
21.07.2006, 11:01 Uhr whose Posts: 2156 Nutzer |
Zitat: Doch, das kann man. Sogar sehr simpel. Eigenen Port kreieren, Fenster zuerst ohne IDCMP öffnen, Adresse des Ports ins Feld "UserPort" schreiben, ModifyIDCMP() für die gewünschten IDCMP-Flags benutzen, los geht's. Beschrieben ist das im RKM "Libraries" ab Seite 253. Da steht dann auch die Warnung bezüglich eventuell noch anstehender Messages für das zu schließende Fenster. Die müssen zuerst abgearbeitet werden, bevor das Fenster geschlossen wird. Aber das gilt so strikt, wie gesagt, nur für Fenster mit einem gemeinsam genutzten Message Port bzw. für Fenster, die einen nicht von Intuition gestellten Message Port benutzen. Grüße -- --- ![]() ![]() [ Dieser Beitrag wurde von whose am 21.07.2006 um 11:03 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
21.07.2006, 12:29 Uhr Holger Posts: 8116 Nutzer |
Zitat: Darf man nicht nur, sondern muß man auch, wenn man sich der kritischen Zahl 16 nähert. Da ohne shared port für jedes Fenster ein eigener MessagePort angelegt wird, wird pro Fenster ein Signal verbraucht. Und davon hat man nicht so viele, jeder Prozeß verbraucht schon von Hause aus eins, dann hat man evtl. ARexx-Port oder device-I/O, asynch-I/O und wer weiß was noch für Gründe, Ports anzulegen. Da kann es dann schon eng werden. Abgesehen davon ist es natürlich einfacher, alle GUI-Messages über einen Port abzuwickeln, es kommen schließlich ohnehin nur am aktiven Fenster Nachrichten an. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
21.07.2006, 12:35 Uhr Holger Posts: 8116 Nutzer |
Zitat: Du brauchst nicht alle Messages abzuholen, aber die, die Du schon abgeholt hast, mußt Du natürlich per ReplyMsg zurückschicken. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
21.07.2006, 14:16 Uhr Reth Posts: 1860 Nutzer |
Zitat: Das passiert bereits, bevor die bearbeitende Klasse aufgerufen wird, ist somit im Beendigungsfall schon erledigt. [ - Antworten - Zitieren - Direktlink - ] |
1 -2- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Programmierung > Fragen zu Intuition-Messages | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
![]() |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2025 by amiga-news.de - alle Rechte vorbehalten. |
![]() |