You are here

윈도우즈 콘솔에 출력되는 메세지를 GUI에 뿌리는 문제...

아래의 코드는 졸업한 후배가 작성해 놓은 코드의 일부분입니다.
그런데 문제가 좀 있는 것 같아 수정을 하고 싶은데 도저히 모르겠습니다.

간단하게 전체 프로그램을 설명드리겠습니다.
GUI에서 Win.exe라는 계산 프로그램을 Run 버튼을 눌러 실행을 합니다.
그러면 Win.exe는
계산을 하면서 제가 보고자하는 변수값들을 반복 계산하면서
standard output으로 콘솔 창에 뿌려주고
별도로 process라는 파일을 열어 프로그램 진행률을 출력합니다.
그리고 100%가 되면 Win.exe는 완료됩니다.

문제는 윈도우즈 콘솔에 대략 20초 마다
standard output으로 계산되는 변수값들이 뿌려지는데,
그렇게 뿌려지는 결과가 프로그램이 완전히 종료된 후에
한꺼번에 GUI에 써지는 문제가 있는 것 같습니다.

이제 막 Tcl/Tk를 들여다 봤기 때문에,
도저히 이해가 안 됩니다.
제가 구현하고자 하는 것은
윈도우즈 콘솔에 임의의 변수값들이 뿌려지면
프로그램(Win.exe)이 종료되기 전에도 그때 그때 봤으면 좋겠습니다.
말그대로, 윈도우즈 콘솔이 GUI에 들어가 있는 것 처럼 하고 싶습니다.
좀 이해가 되셨으면 좋겠는데...

######## program run geomety ############################
variable runbutton
variable stopbutton
variable text
variable progressbar

set lf9 [ttk::labelframe $frin1.lf9 -text "RUN"]
pack $lf9 -fill x -padx 3

set mainframe [ttk::frame $lf9.mainframe]
pack $mainframe -side top -fill both -expand true

set btnframe [ttk::frame $mainframe.btnframe]
pack $btnframe -side top -fill both -pady 5
set frame [ttk::frame $btnframe.frame]
pack $frame
set runbutton [ttk::button $frame.runbutton \
        -text "Run" -width 8 \
        -command { Run }]
pack $runbutton -padx 5 -side left
set stopbutton [ttk::button $frame.stopbutton \
        -text "Stop" -width 8 \
        -state disabled \
        -command { Stop }]
pack $stopbutton -padx 5 -side left

set progressbar [ttk::progressbar $mainframe.progressbar]
pack $progressbar -side top -fill both -padx 10

set sw [ScrolledWindow $mainframe.sw \
-relief flat -borderwidth 0]
set path [file join $::BWIDGET::LIBRARY images]
set text [text $sw.text\
        -background "#ffffff" \
        -foreground "#000000" \
        -insertbackground "#000000" \
        -highlightthickness 0 \
        -wrap char \
        -height 1 \
        -borderwidth 0 \
        -width 15 \
        -height 10]
$sw setwidget $text
pack $sw -pady 5 -padx 5 \
-side top -expand true -fill both

set sep [ttk::separator $mainframe.sep -orient horizontal]
pack $sep -side top -fill x -padx 5

set ::progressicon [ttk::label $mainframe.progressicon]
::anigif::anigif ./progress.gif $::progressicon
pack $::progressicon -anchor se -side top -padx 10

::anigif::stop $::progressicon

###############################################################################

proc Run {} {

        set pushd [pwd]

        cd TCP2D

        variable pid
        variable execstatus

        variable runbutton
        variable stopbutton

        $runbutton configure -state disabled
        $stopbutton configure -state normal

        set ::progress_file "./process"

        initwatch
        watchfile $::progress_file UpdateProgress 10
        ::anigif::restart $::progressicon

        set cmd "Win.exe"

        if { [catch { set pid [eval \
                blt::bgexec execstatus \
                -onoutput ::StdoutMessage \
                -onerror ::StderrMessage \
                -keepnewline true \
                $cmd &] } errmsg] } {
                tk_messageBox -message $errmsg -icon error
                stopwatch

                $runbutton configure -state normal
                $stopbutton configure -state disabled
        } else {
                tkwait variable execstatus
                stopwatch

                $runbutton configure -state normal
                $stopbutton configure -state disabled
        }; # end if then else

        tk_messageBox -message "Finished." -icon info

        UpdateProgress
        ::anigif::stop $::progressicon
        cd $pushd

}; # end proc Run

proc StdoutMessage {msg} {
        variable text

        $text insert end $msg
}

proc StderrMessage {msg} {
        variable text

        $text insert end $msg
}

proc Stop {} {
        variable pid
        variable execstatus

        set execstatus 0
}

proc initwatch {} {
        variable stopwatch
        set stopwatch 0
}

proc watchfile {name body {interval 1000}} {
        variable stopwatch

        if { $stopwatch } return

                if { [file exist $name] } {
                        update

                        if { [catch { set t [file mtime $name] }] } {
                                after $interval [info level 0]
                        }
                        if [catch {expr {$t - [set watchfile::$name]}} dt] {
                                namespace eval watchfile [list variable $name $t]
                        } elseif $dt {
                                eval $body
                                set watchfile::$name $t
                        }
        }
        after $interval [info level 0]
}

proc stopwatch {} {
        variable stopwatch
        set stopwatch 1
}

proc UpdateProgress {} {
        variable text
        variable progressbar

        if { ![file exist $::progress_file] } return

        set f [open $::progress_file]
        set pos [read $f]
        set pos [expr int($pos)]
        close $f

        $progressbar configure -value $pos
}