Ok, bin etwas weiter und verwirrt.
Wo ist denn der Unterschied zwischen diesen beiden codes? (bis auf die Buttonverteilung?
using namespace std;
using namespace LibSerial;
SerialStream rs232;
...
...
// OPEN PORT
void plot232V1_1Dialog::OnOpen(wxCommandEvent& event)
{
rs232.Open( "/dev/ttyUSB0") ;
rs232.SetBaudRate( SerialStreamBuf::BAUD_9600 ) ;
rs232.SetCharSize( SerialStreamBuf::CHAR_SIZE_8 ) ;
rs232.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE ) ;
rs232.SetParity( SerialStreamBuf::PARITY_NONE ) ;
rs232.SetNumOfStopBits(1) ;
rs232.SetVTime(1);
rs232.SetVMin(100);
}
// CLOSE PORT
void plot232V1_1Dialog::OnClosePort(wxCommandEvent& event)
{
rs232.Close();
}
// READ TXT
void plot232V1_1Dialog::OnButton4Click(wxCommandEvent& event)
{
char next_char[100];
// READ
rs232.read(next_char,100);
wxString str(next_char,wxConvUTF8);
StaticText1->SetLabel(str);
Layout();
}
using namespace std;
using namespace LibSerial;
SerialStream rs232;
...
...
// OPEN PORT
void plot232V1_1Dialog::OnOpen(wxCommandEvent& event)
{
rs232.Open( "/dev/ttyUSB0") ;
rs232.SetBaudRate( SerialStreamBuf::BAUD_9600 ) ;
rs232.SetCharSize( SerialStreamBuf::CHAR_SIZE_8 ) ;
rs232.SetFlowControl( SerialStreamBuf::FLOW_CONTROL_NONE ) ;
rs232.SetParity( SerialStreamBuf::PARITY_NONE ) ;
rs232.SetNumOfStopBits(1) ;
rs232.SetVTime(1);
rs232.SetVMin(100);
char next_char[100];
// READ
rs232.read(next_char,100);
wxString str(next_char,wxConvUTF8);
StaticText1->SetLabel(str);
Layout();
rs232.Close();
}
Ist genau der selbe code, nur einmal auf 3 Buttons verteilt (öffnen,lesen,schliessen) und einmal alles in einem Button.
Wenn alles in einem Button ist läuft es ohnen Probleme, bei der verteilten Version ist hinterher immer die Schnittstelle tot -> geht nur ganz kurz.
Kann das was mit nem timeout zu tun haben? Oder sonst jemand eine Idee??
Danke schon mal
Soweit ich das gesehen habe, hängt der Fehler meist damit zusammen, dass entweder eine Partition geprüft wird, die nicht zu Ubuntu gehört (http://ubuntuforums.org/showthread.php?t=599546), oder die UUID der Partition falsch in der /etc/fstab eingetragen ist (https://answers.launchpad.net/ubuntu/+question/29655).
Mit "ls -l /dev/disk/by-uuid/" kannste dir auf jeden Fall alle UUIDs anzeigen lassen, und dann mal mit derjenigen vergleichen die beim booten bemängelt wird. In der /etc/fstab könntest du dann gucken ob diese richtig eingetragen sind, und wenn da eine Partition drin steht, die nicht zu Ubuntu gehört sollte die letzte Zahl eine 0 sein.
Linux-Progger schrieb:
volkard schrieb:
ich als user würde bestimmt die ausführbare datei bevorzugen.
Die ist für mich auch am leichtesten zu implementieren, sonst muss ich auch erst mühsam sicherstellen, dass der Benutzerstring richtig escaped ist und außerdem mache ich mich unnötig von installierten Anwendungen abhängig.
das ist auf jeden Fall das Benutzerunfreundlichste. Man müsste erst mit which im terminal nachsehen, wo die ausführbare Datei überhaupt liegt.
Von daher ist system() oder fork+exec(/bin/sh -c) das bequemste - man könnte auch direkt bash-features einbauen.
Escapen musst du nur, wenn ein unbekannter String aus deinem Programm als Argument an das Benutzer-Programm übergeben wird. Das Escapen für POSIX-Shells geht allerdings ganz einfach mit replace().
Ich mache folgendes um di DSR-Leitung der seriellen Schnittstelle abzufragen:
ioctl(interface_.handle(),TIOCMIWAIT, &bitmask
Kann man für sowas auch irgendwie einen Timeout setzen (wie beim Lesen vom Socket)?
Hallo Phillip,
ich denke du machst es schon genau so richtig.
Ich hatte auch versucht mit flags zu arbeiten
Du hast den Queue Status (leer oder gefüllt), das sind genau die Stati,
die ich meine, in diesem Fall sind keine weiteren Flags sinnvoll.
Im übrigen habe ich mein Problem mit semaphoren gelöst.
Genau so geht es, du musst den Zugriff auf die Queue über Semaphore schützen.
Am besten über Getter und Setter und in den Methoden/Funktionen dann die Semaphore (am besten scoped lock/unlock) bedienen.
Somit war ein timeout hier nur bedingt möglich.
Nötig ist ein Timeout nicht, möglich aber immer. Du mußt auch oder gerade als deamon sauber terminieren. Normalerweise 'fällst' du bei einem beliebigen Signal
aus dem Condition Wait heraus. Dann kann man ein Terminierungsflag prüfen,
seinen queustatus prüfen und eventuell wieder warten ...
Ich warte immer nur endlich (z.B. eine Sekunde) und prüfe zyklisch,
meine 'Stati', dann darf auch 'mal' ein Signal verloren gehen.
Das würde dann zwar Zeit 'kosten' aber nicht zu einem Hänger führen ...
Wie auch immer hört sich gut an was du da machst ...
Gruß Frank
"Stattdessen muss ich der Thread-Funktion den this-Pointer übergeben, diesen casten, um ihn schliesslich zu verwenden. Das sieht etwa so aus ..."
Das ist der vorgesehene Weg und ich habe das genau so schon oft gemacht.
Einziges Problem das du lösen musst: Du musst sicher stellen das die Klasse worauf der this Pointer zeigt nicht gelöscht wird solange wie der Thread läuft.
Das sollte im Destruktor der Klasse geprüft und sicher gestellt werden.
Statische Variablen und Threads passen nicht gut zusammen und können eine
ganze Menge Ärger machen. Wenn möglich verzichte einfach darauf.
Falls du diese Kombination dennoch verwenden möchtest musst du den Zugriff
über eine zusätzliche statische CriticalSection (Mutex) absichern.
Also: die Sache mit dem this Pointer ist der richtige Weg ...
Zusätzlich werden bei mir in diesem Fall ALLE Zugriffe auf die Klassen
Member über Getter und Setter realisiert.
In den Gettern und Settern verwende ich sogenannte LockGuards
(Scoped Mutexe, kleine Helper Klassen, die automatisch im Construktor Lock und im Destruktor Unlock ausführen).
Viel Erfolg, Gruß Frank.
xadian schrieb:
Ok, hab's grad selbst rausgefunden. Die zu schreibende Datei liegt im Shared Folder der virtuellen Maschine und der hat als Dateisyste 'vboxsf'. Sobald ich den Pfad auf mein home Verzeichnis verändert habe gings auch mit größeren Dateien. Wäre trotzdem interessant zu erfahren woher genau der Fehler kommt/warum das Dateisystem Probleme mit solchen Operationen hat. Normale Textdateien gehen in beliebiger Größe zu erstellen...
Ich hatte auch schon Probleme mit diesem Dateisystem, Hostsystem war Linux, Gastsystem Vista und in Vista wollte ich ein etwas größeres Visual Studio Projekt öffnen das in solch einem Verzeichnis lag und Visual Studio hat dabei immer den Dienst quittiert mit entsprechender Meldung. Nachdem ich das Projekt in das virtuelle Dateisystem kopiert hatte ging es ohne Probleme.
Da ist das Dateisystem wohl einfach noch nicht ausgereift. Da du aber einen schönen kleinen Testfall hast könntest du das ja den Entwicklern melden
Wie wäre es mit man: XGrabPointer?
Manpages schrieb:
If a confine_to window is specified, the pointer is restricted to stay contained in that window. The confine_to window need have no relationship to the grab_window. If the pointer is not initially in the confine_to window, it is warped automatically to the closest edge just before the grab activates and enter/leave events are generated as usual. If the confine_to window is subsequently reconfigured, the pointer is warped automatically, as necessary, to keep it contained in the window.
The function fflush() forces a write of all user-space buffered data
for the given output or update stream via the stream's underlying write
function. The open status of the stream is unaffected.
If the stream argument is NULL, fflush() flushes all open output streams.
quelle: man fflush
Heuschrecke schrieb:
Danke für die Antwort.
Es scheint so zu sein, dass es sich tatsächlich um ein kdevelop Problem handelt und ich dort irgendwas falsch konfiguriert habe (ich also falsch gepostet habe). Ich probiere nun eine geeignetere IDE. Bei kdevelop scheine ich noch mehr nicht zu verstehen....
mit MonoDevelop kann man auch C / C++ Programme mit GTK+ und anderen Libraries, welche mit pkg-config arbeiten, sehr gut programmieren. Bis auf paar Kleinigkeiten kann man mit der Version 2.0 ganz gut arbeiten.
blan
Ist eigentlich schon der einfachste Weg, wenn du dir die IP selbst schreiben willst. Allerdings kann du dir die IP auch von inet_ntop schreiben lassen.
struct hostent *server;
char ip [INET_ADDRSTRLEN];
server = gethostbyname("localhost");
inet_ntop (AF_INET, server->h_addr_list [0], ip, INET_ADDRSTRLEN);
printf ("%s\n", ip);
Also erstmal schreibst du das "-c" wieder in die "cflags". Dann machst du aus ".c" bei den Dateien in "objects" mal wieder ein ".o".
Als letztes entfernst du "team-builder.c" aus Zeile 8.
Wenn du nun alle C-Files berücksichtigt hast sollte es gehen.
Gruß!