Hallo,
Es geht um die Portierung eines UNIX-CPP-Programmes nach Windows.
Das Programm benutzt TCL.<br>
Es wird die Ausgabe in eine Pipe umgeleitet und ein Channel registriert, der von TCL aufgerufen wird wenn es etwas zu lesen gibt.
<br>
Die Channel-Handler-Funktion verschluckt den ersten Buchstaben (allo anstatt von hallo),
danach wird sie immer aufgerufen obwohl es nichts auszulesen gibt (Programm blockiert).<br>
Unter Linux funktioniert es fehlerfrei.
Woran könnte das liegen?
Hier der Programmcode:
<br><br>
int output_pipe[2];><br>
static const char* tcllib = "c:\\programme\\tcl\\lib\\tcl8.3";<br>
static const char* tklib = "c:\\programme\\tcl\\lib\\tk8.3";<br>
<br>
void handleOutput (void*, int)<br>
{<br>
char buffer[1024];<br>
int count;<br>
cerr << "read() start" << endl;<br>
count = read (output_pipe[0], buffer, 1023);<br>
buffer[count] = 0;<br>
cerr << "\nobegin\n" << buffer << "\noend" << endl;<br>
}<br>
<br>
int main ()<br>
{<br>
cerr << "start" << endl;<br>
int b1 = _pipe (output_pipe, 1024, O_TEXT);<br>
assert (b1 != -1);<br>
close (1);<br>
int b2 = dup (output_pipe[1]);<br>
assert (b2 != -1);<br>
Tcl_Interp* tcl_interpreter = Tcl_CreateInterp ();<br>
HANDLE rfile = (HANDLE) _get_osfhandle(output_pipe[0]);<br>
Tcl_Channel chan= Tcl_MakeFileChannel (rfile, TCL_READABLE);<br>
Tcl_RegisterChannel (tcl_interpreter, chan);<br>
Tcl_CreateChannelHandler (chan, TCL_READABLE, handleOutput, NULL);<br>
Tcl_SetVar (tcl_interpreter, "tcl_library", (char*)tcllib, TCL_GLOBAL_ONLY);<br>
int a1 = Tcl_Init (tcl_interpreter);<br>
assert (a1 != TCL_ERROR);<br>
Tcl_SetVar (tcl_interpreter, "tk_library",(char*)tklib, TCL_GLOBAL_ONLY);<br>
int a2 = Tk_Init (tcl_interpreter);<br>
assert (a2 != TCL_ERROR);<br>
int a3 = Tcl_VarEval (tcl_interpreter, "button .b -text Hello"<br>
" -command {puts stdout \"Hello\"};" <br>
"pack .b", NULL);<br>
assert (a3 != TCL_ERROR);<br>
cout << "los." << endl;<br>
Tk_MainLoop ();<br>
}<br>
Es geht um die Portierung eines UNIX-CPP-Programmes nach Windows.
Das Programm benutzt TCL.<br>
Es wird die Ausgabe in eine Pipe umgeleitet und ein Channel registriert, der von TCL aufgerufen wird wenn es etwas zu lesen gibt.
<br>
Die Channel-Handler-Funktion verschluckt den ersten Buchstaben (allo anstatt von hallo),
danach wird sie immer aufgerufen obwohl es nichts auszulesen gibt (Programm blockiert).<br>
Unter Linux funktioniert es fehlerfrei.
Woran könnte das liegen?
Hier der Programmcode:
<br><br>
int output_pipe[2];><br>
static const char* tcllib = "c:\\programme\\tcl\\lib\\tcl8.3";<br>
static const char* tklib = "c:\\programme\\tcl\\lib\\tk8.3";<br>
<br>
void handleOutput (void*, int)<br>
{<br>
char buffer[1024];<br>
int count;<br>
cerr << "read() start" << endl;<br>
count = read (output_pipe[0], buffer, 1023);<br>
buffer[count] = 0;<br>
cerr << "\nobegin\n" << buffer << "\noend" << endl;<br>
}<br>
<br>
int main ()<br>
{<br>
cerr << "start" << endl;<br>
int b1 = _pipe (output_pipe, 1024, O_TEXT);<br>
assert (b1 != -1);<br>
close (1);<br>
int b2 = dup (output_pipe[1]);<br>
assert (b2 != -1);<br>
Tcl_Interp* tcl_interpreter = Tcl_CreateInterp ();<br>
HANDLE rfile = (HANDLE) _get_osfhandle(output_pipe[0]);<br>
Tcl_Channel chan= Tcl_MakeFileChannel (rfile, TCL_READABLE);<br>
Tcl_RegisterChannel (tcl_interpreter, chan);<br>
Tcl_CreateChannelHandler (chan, TCL_READABLE, handleOutput, NULL);<br>
Tcl_SetVar (tcl_interpreter, "tcl_library", (char*)tcllib, TCL_GLOBAL_ONLY);<br>
int a1 = Tcl_Init (tcl_interpreter);<br>
assert (a1 != TCL_ERROR);<br>
Tcl_SetVar (tcl_interpreter, "tk_library",(char*)tklib, TCL_GLOBAL_ONLY);<br>
int a2 = Tk_Init (tcl_interpreter);<br>
assert (a2 != TCL_ERROR);<br>
int a3 = Tcl_VarEval (tcl_interpreter, "button .b -text Hello"<br>
" -command {puts stdout \"Hello\"};" <br>
"pack .b", NULL);<br>
assert (a3 != TCL_ERROR);<br>
cout << "los." << endl;<br>
Tk_MainLoop ();<br>
}<br>