Ich arbeite an einer Skizze, die Netzwerkereignisse von einem externen Programm (speziell eine OpenFrameworks-Skizze) erhält, mit der processing.net-Bibliothek.Verarbeitung: Label Text langsam über Netzwerkereignisse zu aktualisieren
Innerhalb der Zeichenmethode, ich habe den folgenden Code zu analysieren, um die eingehenden Daten und ordnen sie in geeigneter Weise einen Wert von Text in einer Textbeschriftung angezeigt werden: die
void draw()
{
// check for incoming data
Client client = server.available();
if (client != null) {
// check for a full line of incoming data
String line = client.readStringUntil('\n');
if (line != null) {
//println(line);
int val = int(trim(line)); // extract the predicted class
//println(val);
if (val == 1) {
messageText = "EVENT 1";
} else if (val == 2) {
messageText = "EVENT 2";
} else if (val == 3) {
messageText = "EVENT 3";
}
}
}
// draw
background(0);
textFont(f,64);
fill(255);
textAlign(CENTER);
text(messageText, width/2, height/2);
}
Durch Protokollierung, habe ich das überprüft Daten werden richtig empfangen
Ich habe jedoch einen sehr nervigen Bug - der Text meines messageText Labels ist sehr langsam zu aktualisieren ... nachdem ein neues Ereignis aufgetreten ist (und als solches durch Protokollierung angezeigt wird), Der Nachrichtentext zeigt weiterhin den Wert des letzten Ereignisses für einige Sekunden an.
Wer hat irgendwelche Hinweise, wie man die Leistung hier beschleunigt?
Danke!
EDIT: Unten ist die vollständige, komplette Skizze Code:
import processing.net.*; // include the networking library
Server server; // will receive predictions
String messageText;
PFont f;
void setup()
{
fullScreen();
//size(200,200);
server = new Server(this, 5204); // listen on port 5204
messageText = "NO HAND";
f = createFont("Arial",16,true); // Arial, 16 point, anti-aliasing on
}
void draw()
{
// check for incoming data
Client client = server.available();
if (client != null) {
// check for a full line of incoming data
String line = client.readStringUntil('\n');
if (line != null) {
//println(line);
int val = int(trim(line)); // extract the predicted class
//println(val);
if (val == 1) {
messageText = "EVENT 1";
} else if (val == 2) {
messageText = "EVENT 2";
} else if (val == 3) {
messageText = "EVENT 3";
}
}
}
// draw
background(0);
textFont(f,64);
fill(255);
textAlign(CENTER);
text(messageText, width/2, height/2);
}
EDIT2 Als Kevin unten wies darauf hin, meine Lösung ist ziemlich hacky. Ich versuche, die Message Events Methoden aus der Netzwerkbibliothek zu verwenden, anstatt meinen gesamten Netzwerkcode innerhalb der draw()
-Methode stopfen.
Also habe ich versucht, die Methode clientEvent als solche zu implementieren. Allerdings glaube ich, dass ich etwas falsch verstanden habe ... obwohl mein ursprünglicher, Hacky-Code jetzt OK zu funktionieren scheint, scheint mein neuer Code unter Verwendung dieser Delegiertenmethode überhaupt nicht zu funktionieren. Grundsätzlich muss ich zuerst meine Skizze ausführen, wodurch ein Server entsteht, mit dem mein externes Programm verbunden ist. Das Programm sendet dann Daten, die von meiner Verarbeitungsskizze empfangen wurden.
So sieht meine vollständige Skizze aus - weiß jemand wo mein Missverständnis herkommt?
import processing.net.*; // include the networking library
Server server; // will receive predictions
Client client;
String messageText;
int dataIn;
PFont f;
void setup() {
fullScreen(P3D);
frameRate(600);
server = new Server(this, 5204); // listen on port 5204
client = server.available();
messageText = "NO HAND";
textAlign(CENTER);
fill(255);
f = createFont("Arial",48,true); // Arial, 16 point, anti-aliasing on
textFont(f, 120);
}
void draw() {
// draw
background(0);
text(messageText, width/2, height/2);
}
// If there is information available to read
// this event will be triggered
void clientEvent(Client client) {
String msg = client.readStringUntil('\n');
// The value of msg will be null until the
// end of the String is reached
if (msg != null) {
int val = int(trim(line)); // extract the predicted class
println(val);
if (val == 1) {
messageText = "A";
} else if (val == 2) {
messageText = "B";
} else if (val == 3) {
messageText = "C";
} else if (val == 4) {
messageText = "D";
}
}
}
}
Es wird ziemlich schwierig sein, Ihnen zu helfen, ohne ein [mcve] zu sehen. Wo sprichst du mit diesem Protokoll? –
@KevinWorkman Es sind die 'println (val)' - Funktionen, die momentan auskommentiert sind. Ich habe den Beitrag mit der vollständigen Skizze aktualisiert. Vielen Dank! – narner
Ich sehe nichts falsch daran, außer vielleicht die 'client' Variable innerhalb der' draw() 'Funktion zu erstellen. Sollten Sie das nicht einfach einmal in der 'setup()' Funktion erstellen? –