amiga-news 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:
Original von NoImag:
Stimmt, in so einem Fall macht ein Hintergrundtask Sinn. Allerdings bedeutet dies auch eine Kopie des Dokuments anlegen zu müssen, was eventuell erhebliche Resourcen erfordern kann (insbesondere beim Drucken).

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:
Naja, Smartrefresh-Fenster gibt es schon seit 1.x-Zeiten und damals war Resourcenschonung noch wirklich wichtig.
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:
So ein Aufwand ist der Aufruf eines Requesters nicht. Wie machst du das, wenn du testest, ob eine Datei schon existiert und du dann den User fragst, ob sie überschrieben werden darf?
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:
Ein Unterschied ist mir da bisher nicht aufgefallen. Was machst du, wenn ein Fehler auftritt und es mehrere Möglichkeiten gibt fortzufahren?
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:
Original von NoImag:
Ich habe nicht den Anspruch alles perfekt zu machen. Man kann auch in Schönheit sterben.

...

Dass eine eine Reihe von Fällen gibt, bei denen dies sinnvoll ist, habe ich nie bezweifelt. Ich unterscheide in der Regel mehrere Fälle: 1. Unbedingt notwendig 2. Empfehlenswert 3. Wünschenswert 4. Überflüssig.


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:
Original von NoImag:
Zitat:
Original von whose:
Das hängt davon ab, welche "Rückmeldung vom User" Du dem Hintergrund-Task schicken willst.


Ich denke da vor allem an Fehler, bei denen es mehrere Reaktionsmöglichkeiten gibt.


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

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

12.07.2006, 22:09 Uhr

NoImag
Posts: 1050
Nutzer
Zitat:
Original von Holger:
Ein Textdokument, selbst mit styles, zu kopieren, ist kein großer Akt.


Natürlich nicht.

Zitat:
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.

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:
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.

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:
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...

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:
Ganz einfach: zwei Aktionen 1.) Prüfe Vorbedingungen 2.) Schreibe Daten. Dazwischen können UI-Events bearbeitet werden.

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:
Erste Aktion aufgrund des Fehlers abbrechen und nach der User-Aktion abhängig von der User-Aktion eine neue Aktion starten.

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:
Original von Holger:
Es schadet aber nichts, wenn man dabei den Idealfall, bzw. die in der aktuellen Implementierung vorhandenen Defizite im Hinterkopf behält.


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:
Original von whose:
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.


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:
Original von NoImag:
Zitat:
Original von whose:
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.


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?


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

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

13.07.2006, 13:25 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von NoImag:
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?


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:
Original von whose:
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.


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:
Original von Holger:
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.


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:
Original von NoImag:
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?


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

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

16.07.2006, 15:55 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von NoImag:
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).


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:
Original von Holger:
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ß.


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:
Ist natürlich vollkommener Quatsch, die Akquise des Clipboard-Inhalts und das Einfügen in das Dokument miteinander zu vermischen.

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:
Original von NoImag:
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.


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 :D

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 :D

Grüße

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

19.07.2006, 12:31 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von NoImag:
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.


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:
Original von whose:
Wieso muß?


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:
Original von Holger:
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.


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:
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.

Das wäre machbar. Es würde dann praktisch das Einsetzen wie bisher ablaufen, nur vor der Rückfrage und nicht danach.

Zitat:
Wenn dann der Platz ausreicht oder die Rückfrage positiv beantwortet wurde, müssen die Daten nur noch aktiv werden, Pointer umbiegen o.ä.

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:
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.

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:
Original von NoImag:
Zitat:
Original von whose:
Wieso muß?


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. ;)


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

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

20.07.2006, 22:07 Uhr

NoImag
Posts: 1050
Nutzer
Zitat:
Original von whose:
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.


Im Prinzip läuft es zur Zeit läuft so. Halt alles im selben Task.

Zitat:
Das einzige Problem bleibt in der Blockierung des Clipboards, solange sich der Benutzer nicht entschieden hat. Bescheidene Situation irgendwie...

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:
Original von NoImag:
Zitat:
Das einzige Problem bleibt in der Blockierung des Clipboards, solange sich der Benutzer nicht entschieden hat. Bescheidene Situation irgendwie...

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.


Da hast Du wohl Recht. Auch meiner Meinung nach ist eine Blockade mit Warnung auf jeden Fall die bessere Lösung.

Grüße

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

21.07.2006, 10:00 Uhr

Reth
Posts: 1858
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: 7717
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: 1858
Nutzer
@thomas:

Danke Dir!
Dann kann ich ja unbesorgt nicht in meine Schleife zurückkehren! :D

[ - 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

--
---

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

[ - Antworten - Zitieren - Direktlink - ]

21.07.2006, 10:47 Uhr

Reth
Posts: 1858
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:
Original von Reth:
@whose:
Hab ich nicht vor (aber wer weiss...).
Wusste gar nicht, dass man den UserPort eines Intuition-Fensters selbst setzen darf!?


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

--
---

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


[ 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:
Original von Reth:
@whose:
Hab ich nicht vor (aber wer weiss...).
Wusste gar nicht, dass man den UserPort eines Intuition-Fensters selbst setzen darf!?


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:
Original von Reth:
Geht das so, oder bringt das Intuition durcheinander, wenn nicht alle Messages abgearbeitet (und damit replied) wurden und dann die Quellen einfach geschlossen werden?


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: 1858
Nutzer
Zitat:
Original von Holger:
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.


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-2024 by amiga-news.de - alle Rechte vorbehalten.
.