PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : scanf in (Q)thread BENÖTIGT EOF ??



FriedrichLaher
10-10-2005, 13:09
#include<qapplication.h>
#include<qthread.h>
#include<stdio.h>
#include<unistd.h>

int a=1, b,c=0;

class rdFrmEmacs : public QThread {

public:
virtual void run();
};
void
rdFrmEmacs::run()
{
do
{ if (!c)
{ scanf("%d %d\n",&a,&b); // from emacs
c = a+b;
}
}while(a >= 0);
}
int main()
{ rdFrmEmacs t; t.start();
do{
if(c)
{ printf("Summe aus Thread t %d\n",c);
fflush(stdout);
c=0;
}
}while(a >= 0);
t.wait();
}

arbeite nur dann wie erwartet wenn die Eingaben
nichtnur mit Returntaste, sondern danach auch noch
mit ctl-D abgeschlossen werden.

Und eigentlich hätte ich auch noch die Ausgabe der
letzten Summe erwartet, die sich aus dem a < 0 ergibt.

Dieser Code
ist nur eine Vorübung für ein wesentlich größeres
Programm daß durch emacs-lisp als asynchroner
prozess gestartet wird.

Joghurt
10-10-2005, 14:35
]arbeite nur dann wie erwartet wenn die Eingaben
nichtnur mit Returntaste, sondern danach auch noch
mit ctl-D abgeschlossen werden.Ja, du rufst scanf ja auch solange auf, bis ein EOF kommt.

FriedrichLaher
10-10-2005, 16:13
nein, Endekriterium für das "do" im Thread ist ja

"erste eingegebene Zahl < 0 " ( eben
}while ( a >= 0 );
auch
muß ja im gegebenen Code ( unverständlicherweise )
für JEDE Ausgabe die man erhält ein EOF ( cntrl-D ) getippt
werden.
( bzw. via emacs z.B.

(process-send-string "pn" "1 2 \n^D))

anda_skoa
10-10-2005, 17:29
Wozu brauchst du den Thread?

Ciao,
_

FriedrichLaher
10-10-2005, 17:57
in der beabsichtigen Anwendung "scannt" die "main"
das Geschehen in einem Bildschirmfenster ( Internetspiel ) durch auslesen des Bildschirmspeichers,
die Ausgaben gehen an emacs, und überprüft auch ob "kommandos" von emacs anliegen.

Einfacher wäre es wenn ein qt-Programm auch Mausklicks
mitbekommen könnte die für ein anderes Fenster ( eben das Spiel ) bestimmt sind.

locus vivendi
10-10-2005, 18:11
[...] arbeite nur dann wie erwartet [...]
Es ist dann immer sehr hilfreich mitzuteilen, *was* man denn erwartet.

Zu deinem Programm: Wenn du mit Threads arbeitest, müsstest du irgendwie den Zugriff auf gemeinsame Daten aus unterschiedlichen Threads synchronisieren, das ist dir doch bewußt, oder? So können lustige Dinge passieren, wie doppelte (x-fache...) Ausgaben für ein Ergebnis, Busy-Waits, evtl... könnte es sogar sein das beide Schleifen endlos laufen (naja, beim letzten bin ich mir nicht sicher).

Außerdem, falls das dein "richtiger" Code ist, und nicht eine hier fürs Forum verkleinerte Version, gehört der Rückgabewert von scanf überprüft. Das ist sonst auch ein heißer Kandidat für eine Endlosschleife.

anda_skoa
10-10-2005, 22:52
in der beabsichtigen Anwendung "scannt" die "main"
das Geschehen in einem Bildschirmfenster ( Internetspiel ) durch auslesen des Bildschirmspeichers,
die Ausgaben gehen an emacs, und überprüft auch ob "kommandos" von emacs anliegen.

Könnte man dann nicht emacs mit einem QProcess starten und dort einfach dessen Output lesen?



Einfacher wäre es wenn ein qt-Programm auch Mausklicks
mitbekommen könnte die für ein anderes Fenster ( eben das Spiel ) bestimmt sind.

Geht durchaus, vielleicht abhängig von der Plattform.
Ich schätze unter Windows kann man auch die Windows Messages anderer Fenster bekommen, unter X11 geht das ziemlich sicher wenn man das dem X Server mitteilt.

Ciao,
_