2011-09-12 3 views
0

이것은 내 코드입니다. 나는 그것이 실행 중일 때 ".display_message"를 표시하지 않는 문제에 직면하고 있습니다. proc torun {}이 작업을 완료 한 후에야 메시지가 나타납니다. Btw, 2000 년 이후 실제로 내 프로그램을 실행합니다. 내가 적용 할 수 없다고 생각하는 매우 긴 코드이므로 단순화하기 위해 제거했습니다. 제발 이걸 안내 해줘. 감사.프로그램 실행 중 목록 상자 또는 텍스트를 표시하는 방법

proc torun {} { 
    set total [.display_pc2 size] 
    .display_message insert end "test" 


    for {set x 0} {$x < $total} {incr x} { 
     set machine [.display_pc2 get $x] 
      .display_message insert end "Copy to $machine now. Please wait..." 
      .display_message see end 
      after 2000 
      .display_message insert end "Copy to $machine done" 
      .display_message see end 
      after 2000 
    } 
} 

답변

0

(당신이 무슨 일을하는지 GUI 인 경우에) 나는 TK를 해본 적이 없다,하지만 메시지를 강제로 표시 puts를 사용할 때 어쩌면 당신은 flush 일부 상당이 필요합니다.

이후 .display_message proc 내부에서 수행 된 작업을 추측 할 수 없습니다.

편집 :

그냥 생각이있어 : 당신은 가짜 멀티 스레드 귀하의 응용 프로그램에 after 명령을 사용할 수 있습니다. 이벤트 핸들러로 현재 시저에서 독립적으로 실행됩니다

after 0 [list .display_message insert end "Copy to $machine now. Please wait..."; .display_message see end]

. 어쩌면 당신의 플러시 문제를 해결할 수 있습니다. (이벤트 루프 또는 update 명령 필요)

+1

하나는 지금까지'update'을 사용하지 특히 ​​라이브러리 (패키지) 코드 http://wiki.tcl.tk/1255 를 볼 안됩니다. 짧은 이야기는'update'가 이벤트 루프를 다시 입력함으로써 이벤트 구동 코드에 의해 처리 된 이벤트의 재 순서화를인지 할 수 있다는 것입니다. – kostix

+0

_outgoing_ 플러시에 가장 가까운 개념은'update idletasks'입니다 (일치하는 것은 정확하지 않지만 이유를 설명하기 위해서는 꽤 긴 에세이가 필요합니다). _both_ 방향의 플러시는 '업데이트'이며 재진입 코드로 수행중인 작업을 정확히 알지 않으면 위험합니다. (내가 뭘하는지 알기 때문에 프로덕션 코드에서'update'를 사용하지 않습니다.) –

2

이 코드를 작성하는 방법을 완전히 바꾸고 idle callbacks을 사용해야합니다.

아이디어는 "할 일 목록"을 작성하여 어딘가에 저장 한 다음 한 번에 한 항목 씩 처리하여 유휴 콜백을 사용하여 실행 일정을 다시 조정한다는 것입니다.

스케치은 다음과 같습니다

proc show_transfer_start {target} { 
    .display_progress add ... $target 
} 

proc show_transfer_result {res} { 
    .display_progress add ... $res 
} 

proc schedule_transfer {target rest} { 
    after idle [after 0 [list do_step $target $rest]] 
} 

proc do_step {target rest} { 
    set res [copy --to $target] 
    show_transfer_result $res 
    if {[llength $rest] > 0} { 
    set next [lindex $rest 0] 
    show_transfer_start $next 
    schedule_tranfer $next [lrange $rest 1 end] 
    } 
} 

set targets [list box1 box2 box3] 
set first [lindex $targets 0] 
show_transfer_start $first 
schedule_transfer $first [lrange $targets 1 end]