Announcement

Collapse
No announcement yet.

TCL unter Windows

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • TCL unter Windows

    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>
Working...
X