Genau, Wenn man sich mal überlegt, dann gibt es nur 2 Möglichkeiten einen Thread zu stoppen:
1.) Linux sagen, daß es den Thread mit der Nummer killen soll.
2.) Der Thread überwacht eine Statusvariable und wenn diese den Wert z.B. STOP aufweist, beendet sich der Thread von alleine.
Es gibt viele Moeglichkeiten. Punkt 2) geht auch, mit der Threadklasse oben, implementiere eine stop()-Methode und die while()-Schleife in run() wird beeendet. Haengt natuerlich von der Implementation der run()-Methode ab. Zumal mit einem Objekt, die Aufgaben des Threads besser gekapselt werden koennen, da run() auf private Member der Klasse zugreifen kann, die von aussen nicht zugaenglich sind. Desweiteren ist auch die Erzeugung (Vernichtung) von Threads besser gekapselt. Soll nicht mit pthread sondern mit WinCreateThread (k.A. wie genau das heisst) ein Thread erzeugt werden, dann braucht nur die Implementation von start(), detach(), kill(), join() einer einzigen Klasse angepasst werden, am Interface sollte sich nichts aendern. Das finde ich sehr schoen und sauber.
Btw.: Es heisst synchronisieren ...
Ritchie schrieb:
Dummerweise scheinen hier leider keine "Textausgabefunktionen" vorhanden zu sein.
Suche noch eine Funktion für Textausgabe, ansonsten kann man Grafik ja damit machen.
Google hat mir sofort das hier ausgespuckt: http://www.gamedev.net/reference/articles/article1953.asp
# Beobachtung
Die empfangenden Daten werden nur dann registriert, wenn eine line feed ('\n') angehängt ist. Und genau das macht die Konsole (mit der es immer einwandfrei geklappt hat) im Gegensatz zu meinem Sender.
Merkwürdig ist, dass dieses Verhalten trotz dem Binary Mode überhaupt auftritt.
file_r = fopen("/tmp/el_out_c.pipe", "rb");
# Konsequenz
Da es sich um Binärwerte handelt kann ich meinen Daten nicht einfach ein line feed Steuerzeichen anghängen, da dieses in den Daten selbst vorkommen kann.
Daraus ergibt sich die Frage welche Möglichkeiten es noch gibt, den Empfänger auch ohne line feed Steuerzeichen reagieren zu lassen?
besserwisser schrieb:
..war keine technische, sonderne eine politische.
..
nö, dann würd ich ins politikforum posten. und zwar return 18 :D.
bei uns hieß es früher in der clique immer egal ist schieße oder 88, scheisse riecht von allen seiten gleich ... :p
fetschteste
mfg.
Moh schrieb:
falls jemand eine elegantere methode kennt, her damit
Mach lieber ein eigenes Initskript für Deine Anwendung und lege fest, dass das erst nach dem Sambamount ausgeführt werden soll.
dooooomi schrieb:
tchar n00b schrieb:
Ich brauche auch diese Variante unter Linux.
Wofür? Unter Linux ist es eigentlich nicht üblich, Programme in einer separaten Unicode-Version zu kompilieren.
Soweit ich weiß braucht man das unter Windows vor allem, weil es API-Funktionen doppelt gibt, also mit und ohne Unicode. Unter Linux ist das so nicht der Fall, die Unterscheidung macht also nicht viel Sinn. Was genau möchtest du machen?
ich habe ein programm geschrieben, das zwar unter linux schon läuft, aber unter windows noch nicht.
in der anjuta ide kann ich z.b. sowas machen:
unsigned char* s = "中文德文雙向詞典";
Der String oben besteht aus chinesischen Zeichen.
und dann in main:
puts(s);
und alles ist gut. total genial.
bloß der msvc++ kriegt das nicht gebacken. der fummelt mit wchar_t rum.
also muss ich aus unsigned char* s einen varchar* s machen.
dann ein macro, das mir unter linux nen unisgned char baut und unter windows einen wchar_t erzeugt.
wenns das schon gäbe, so wie es das in der winapi gibt ... usw.
kill ist mir schon klar nur habe ich ja kein event wann und wo ich das machen muss, ich weiss einfach nicht wann der befehl abgearbeitet ist.
system(progammname); bekommt einen befehl den es verarbeitet
ich weiss nicht wie ich von einem anderen prozess aus sehen kann ob dieser befehl beendet ist.
ich hab mir rlwrap jetzt angesehen allerdings reicht mein verständnis wohl nicht wircklich um den knackpunkt zu finden, eigentlich sieht es relativ ähnlich aus,
ich lese per readline befehle ein gebe sie an den kindprozess
dann soll der prozess der readline ausführt warten ( das ist noch mein problem )
bis das kind den befehl abgearbeitet hat
dieser schritt wird in rlwrap wenn ich es richtig verstanden habe auch gemacht, und es ist auch vorgegeben das ein 2ter prozess die daten auswertet.
um den ablauf darzustellen
P1
Daten einlesen
Daten an P2 senden
warten bis P2 fertig ist
und dann wieder von vorne
P2
Programm starten (einmalig)
Daten einlesen / verarbeiten
sofern output -> zurückgeben
Code von P2
dup2(pipeVtoK[0],0); /* Stdout des Vaters = Stdin des Kindes */
close(pipeVtoK[1]); /* auf lesepipe wird nicht geschrieben */
dup2(pipeKtoV[1],1); // ausgabe auf Vater umleiten
dup2(pipeKtoV[1],2); // fehlerausgabe auf Vater umleiten
close(pipeVtoK[0]); // auf schreibpipe wird nicht gelesen
system("sh");
Wenn ihr eine bessere / einfacherere möglichkeit kennt bin ich für jede Hilfe / Anregung dankbar.
Möglich ist es wohl schon, aber vom Aufwand her eher nicht sinnvoll. Wir haben uns jetzt geeinigt in die Produktion einen Mac Rechner zu hängen auf dem in einer VM Windows und Linux läuft.
Nabend besserwisser. Das hatte ich schon ausprobiert, allerdings dachte ich, ich müsse -fPIC auf die Kompilierungsanweisung für die Shared-Lib nehmen.
Nun ja, es funktioniert nun, danke.
_matze schrieb:
Wenn du die Globale nur liest (noch dazu const), kann nix schief gehen.
genau, ansonsten greift hier die Regel der Nebenläufigkeit: gemeinsame Ressources mit einem Mutex/Semaphore schützen.
unter linux werden standardmäßig alle nicht-statischen symbole exportiert. da du c++ verwendest, könnte die option --demangle nützlich sein bei nm.
um eine shared library unter linux zu verwenden, reichen die .so datei und die header dateien. beim linken muss per -l[LIBRARY NAME] hinzugefügt werden. heißt deine bibliothek beispielsweise libxyz.so, so lautet die option -lxyz. per -L kannst du den pfad angeben, in dem diese datei liegt.