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];
    static const char* tcllib = "c:\\programme\\tcl\\lib\\tcl8.3";
    static const char* tklib = "c:\\programme\\tcl\\lib\\tk8.3";

    void
    handleOutput (void*, int)
    {
    char buffer[1024];
    int count;

    cerr << "read() start" << endl;

    count = read (output_pipe[0], buffer, 1023);
    buffer[count] = 0;

    cerr << "\nobegin\n" << buffer << "\noend" << endl;
    }

    int
    main ()
    {
    cerr << "start" << endl;
    int b1 = _pipe (output_pipe, 1024, O_TEXT);
    assert (b1 != -1);
    close (1);
    int b2 = dup (output_pipe[1]);
    assert (b2 != -1);

    Tcl_Interp* tcl_interpreter = Tcl_CreateInterp ();

    HANDLE rfile = (HANDLE) _get_osfhandle(output_pipe[0]);

    Tcl_Channel chan= Tcl_MakeFileChannel (rfile, TCL_READABLE);

    Tcl_RegisterChannel (tcl_interpreter, chan);

    Tcl_CreateChannelHandler (chan,
    TCL_READABLE,
    handleOutput,
    NULL);

    Tcl_SetVar (tcl_interpreter, "tcl_library",
    (char*)tcllib, TCL_GLOBAL_ONLY);

    int a1 = Tcl_Init (tcl_interpreter);
    assert (a1 != TCL_ERROR);

    Tcl_SetVar (tcl_interpreter, "tk_library",
    (char*)tklib, TCL_GLOBAL_ONLY);

    int a2 = Tk_Init (tcl_interpreter);
    assert (a2 != TCL_ERROR);

    int a3 = Tcl_VarEval (tcl_interpreter, "button .b -text Hello"
    " -command {puts stdout \"Hello\"};"
    "pack .b", NULL);

    assert (a3 != TCL_ERROR);

    cout << "los." << endl;

    Tk_MainLoop ();
    }
Working...
X