• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Erfahrungen mit Racket

C

CrimsonKing

Guest
Die API-Dokumentation von Racket beginnt mir ernsthaft auf die Nüsse zu gehen. Ich habe durch Ausprobieren herausgefunden, dass ein text-field im Prinzip mit dem gleichen callback funktioniert wie ein button. Aber wie ich da jetzt die Keycodes auslese: Magie!
 
Themenstarter #203
Die API-Dokumentation von Racket beginnt mir ernsthaft auf die Nüsse zu gehen. Ich habe durch Ausprobieren herausgefunden, dass ein text-field im Prinzip mit dem gleichen callback funktioniert wie ein button. Aber wie ich da jetzt die Keycodes auslese: Magie!
Da geht es Dir nicht anders als wie mir. Bisher habe ich (fast) alles herausgefunden und gelöst, aber vieles nur durch Versuch und Irrtum. Die API ist zwar technisch sehr gut, aber es fehlt an praktikablen Beispielen. Es gibt ja verschiedene Lerntypen, ich lerne sehr schnell, aber auch nur, wenn ich visuell ein praktisches Beispiel vor Augen habe, was ich problemlos schnell mal ausprobieren kann. Aber nobody ist perfekt. Tag für Tag komme ich weiter, desdo tiefer ich eintauche. Es ist viel, sehr viel Arbeit, aber es lohnt sich! Manchmal frage ich mich, wie lange jemand dafür braucht sich einzuarbeiten, der berufstätig ist und nur einen begrenzten Zeitraum zur Verfügung hat. Ich bin ja im Ruhestand und kann mich diesen Dingen durchaus mal 8 Stunden oder länger am Tag widmen. Da kommt man natürlich schneller voran.
 
Themenstarter #204
Habe hier ein seltsames Verhalten:

Code:
; Callback-Verfahren für einen Klick auf die Schaltfläche button (Musik an)

             [callback (lambda (button event)
                         (process "mpg123 http://50.7.129.122:8433/"))])
Funktioniert, aber nach wenigen Minuten trennt er automatisch ohne mein Zutun die Netzwerkverbindung. Das ist nicht nur nervend, sondern ärgerlich und nicht akzeptabel. Im übrigen ist das gleiche Verhalten mit racket zu beobachten unter OpenBSD sowie FreeBSD.

Wenn ich hingegen dieses C Miniprogramm flower.c mit clang compiliere:

Code:
clang flower.c -o flower
funktioniert es einwandfrei.

Hier der C Quellcode:

Code:
#include <stdio.h>

int main()
{
    printf ("Flower Power Radio\n");

system("mpg123 http://50.7.129.122:8433/");

    return 0;
}
Was zum Teufel ist das wieder?

PS: clang habe ich natürlich unter FreeBSd benutzt und unter OpenBSD gcc.
 
Habe hier ein seltsames Verhalten:

Code:
; Callback-Verfahren für einen Klick auf die Schaltfläche button (Musik an)

             [callback (lambda (button event)
                         (process "mpg123 http://50.7.129.122:8433/"))])
Funktioniert, aber nach wenigen Minuten trennt er automatisch ohne mein Zutun die Netzwerkverbindung. Das ist nicht nur nervend, sondern ärgerlich und nicht akzeptabel. Im übrigen ist das gleiche Verhalten mit racket zu beobachten unter OpenBSD sowie FreeBSD.

Wenn ich hingegen dieses C Miniprogramm flower.c mit clang compiliere:

Code:
clang flower.c -o flower
funktioniert es einwandfrei.

Hier der C Quellcode:

Code:
#include <stdio.h>

int main()
{
    printf ("Flower Power Radio\n");

system("mpg123 http://50.7.129.122:8433/");

    return 0;
}
Was zum Teufel ist das wieder?

PS: clang habe ich natürlich unter FreeBSd benutzt und unter OpenBSD gcc.
Hast Du mal system anstelle process probiert?
 

Andy_m4

Well-Known Member
Funktioniert nicht. Ist dir dirpath kein String?
Nein. Es ist vom Typ path
Pfade und Strings sind in Racket unterschiedliche Dateitypen., wasauch sinnvoll ist möchte man Pfade plattformunabhängig darstellen.
Allerdings stehen Dir mit path->string und string->path zwei Funktionen zur Verfügung, um die beiden Formate hin und her zu konvertieren. Mit der Funktion ~a lassen sich auch beliebige Datentypen nach String wandeln.

@CrimsonKing:
Um Text in einem Dialog dazustellen gibts nicht nur die Möglichkeit mit message%
message% hat m.W. nach den Nachteil, dass es keinen Zeilenumbruch macht, wenn die Dialogbox verkleinert wird usw.

Die Alternative wäre ein Read-only text%-Field oder das browser Modul ( http://docs.racket-lang.org/browser/index.html?q=browser#(mod-path._browser) ) welches die Anzeige von HTML-formated Rich-text erlaubt.
Das bietet extra das hyper-frame-mixin welches eine Ableitung von dem normalen frame% ist.
 

Andy_m4

Well-Known Member
Werde ich jetzt machen und dann berichten. Mir wurde von @Andy_m4 geraten, process zu benutzen.
Geraten ist wohl nicht ganz korrekt.
Der Unterschied zwischen den beiden ist:
system ist blockierend und die Ausführung des Racket-Programms wird erst fortgeführt, wenn das aufgerufene Programm beendet ist.
process arbeitet dagegen asynchron.

Funktioniert, aber nach wenigen Minuten trennt er automatisch ohne mein Zutun die Netzwerkverbindung.
Interessantes Phänomen das eine nähere Betrachtung verdient. Mal gucken.
 
C

CrimsonKing

Guest
Die Alternative wäre ein Read-only text%-Field oder das browser Modul ( http://docs.racket-lang.org/browser/index.html?q=browser#(mod-path._browser) ) welches die Anzeige von HTML-formated Rich-text erlaubt.
Danke. Bleibt die Frage, warum message% unter Windows anders aussieht.

Ich verstehe leider nicht ganz, was Du tun willst bzw. was das konkrete Problem ist.
Ich möchte auf jede Eingabe in einem text-field% reagieren (vielleicht wird da ein kleines Tool draus). Das geht zwar mit einem callback, aber ich weiß nicht, wie ich da zum Beispiel ein "Return" erkennen kann. Bei allen anderen Tasten ist das leicht: Den Text auslesen und das letzte Zeichen ist es dann. Aber "Return" ist kein im Text vorhandenes Zeichen.
 
Themenstarter #216
Geraten ist wohl nicht ganz korrekt.
Ok, ich habe es dann selbstständig daraus geschlußfolgert, weil sich asynchron ja für meine Zwecke anbot. Das erreiche ich bei system aber auch mit dem & Zeichen, wenn es angehängt wird. DIe Klasse process ist trotzdem nicht uninteressant, nämlich dann, wenn mehrere Parameter benutzt werden oder pipes eine Rolle spielen. Wenn ich Unsinn schreibe, bitte intervenieren.... ich bin ja noch lange nicht so tief in der Materie als Du.
 
Themenstarter #217
Ich möchte auf jede Eingabe in einem text-field% reagieren (vielleicht wird da ein kleines Tool draus). Das geht zwar mit einem callback, aber ich weiß nicht, wie ich da zum Beispiel ein "Return" erkennen kann. Bei allen anderen Tasten ist das leicht: Den Text auslesen und das letzte Zeichen ist es dann. Aber "Return" ist kein im Text vorhandenes Zeichen.
Das interessiert mich auch, aber ich kann nicht alles auf ein Mal machen, die Event Verarbeitung und Tastaturabfragen kommen aber zeitnah zu Zuge.
 
Themenstarter #218
Ich möchte auf jede Eingabe in einem text-field% reagieren (vielleicht wird da ein kleines Tool draus). Das geht zwar mit einem callback, aber ich weiß nicht, wie ich da zum Beispiel ein "Return" erkennen kann. Bei allen anderen Tasten ist das leicht: Den Text auslesen und das letzte Zeichen ist es dann. Aber "Return" ist kein im Text vorhandenes Zeichen.
Vielleicht ist das das, wonach Du suchst?

Key Event

Das werde ich auch durcharbeiten müssen.
 

Andy_m4

Well-Known Member
Ich denke das ~a steht für die Konvertierung nach alphanumerisch, oder?
Na eher für die Konvertierung eines beliebigen Types nach String.
Ganz konkret ist es eigentlich eine Formatierungsanweisung vergleichbar mit printf in C.
siehe dazu auch:
http://docs.racket-lang.org/reference/strings.html?q=~a#(def._((lib._racket/format..rkt)._~7ea))

Ok, ich habe es dann selbstständig daraus geschlußfolgert, weil sich asynchron ja für meine Zwecke anbot.
Ja. Und eigentlich wäre es auch "the way to go".

DIe Klasse process ist trotzdem nicht uninteressant, nämlich dann, wenn mehrere Parameter benutzt werden oder pipes eine Rolle spielen. Wenn ich Unsinn schreibe, bitte intervenieren.... ich bin ja noch lange nicht so tief in der Materie als Du.
Ich bin ja zum Fragen beantworten da. Sozusagen der Co von midnight :-)

Also process ist keine Klasse, sondern eine Funktion. *korrigier*
Ansonsten gibt process ja auch mehrere Sachen zurück. Unteranderem auch stdin und stdout des gestarteten Prozesses. Man kann also dem Prozess so einfach was schicken (pipen) oder von ihm empfangen.

Ich habe ja so den leisen Verdacht, dass damit verbunden sind auch die von Dir beschriebenen Probleme zusammenhängen. Das wenn diese Werte nicht gehalten werden dann irgendwann der Garbage-Collector zuschlägt und denkt, dass wird nicht mehr gebraucht und sich das auf den Kindprozess niederschlägt.
 
C

CrimsonKing

Guest
Ich komme voraussichtlich nicht vor Sonnabend dazu, mir das Problem genauer anzusehen. Noch kannst du schneller sein. ;)