2016-09-12 1 views
0

Я пытаюсь понять работу нити: ждать от кода нижеПочему мой tcl поток выходит, когда :: thread :: wait присутствует?

set logger [thread::create { 
    proc OpenLog {file} { 
    global fid 
    set fid [open $file a] 
} proc CloseLog {} { 
    global fid 
    close $fid 
} proc AddLog { 
    msg} { 
    global fid 
    puts $fid $msg 
} thread::wait 
}] 

% ::thread::exists $logger 
0 

Почему приведенный выше код не ждет даже и выхода на месте?

ответ

2

Проблема заключается в том, что ваш сценарий создания потоков имеет в себе некоторые синтаксические ошибки, из-за чего он не запускается правильно; он асинхронно умирает и выводит сообщение об ошибке. Эта ошибка, кажется, пропадает в вашем случае; не знаю, почему, но она должна что-то вроде следующего содержания:

 
Error from thread tid0x100481000 
wrong # args: should be "proc name args body" 
    while executing 
"proc OpenLog {file} { 
    global fid 
    set fid [open $file a] 
} proc CloseLog {} { 
    global fid 
    close $fid 
} proc AddLog { 
    msg} { 
    global fid..." 

Если исправить очевидные проблемы синтаксиса, преобразования пространства для новых строк, где это имеет значение, то мы можем получить это, которое, кажется, работает для меня:

set logger [thread::create { 
    proc OpenLog {file} { 
     global fid 
     set fid [open $file a] 
    } 
    proc CloseLog {} { 
     global fid 
     close $fid 
    } 
    proc AddLog {msg} { 
     global fid 
     puts $fid $msg 
    } 
    thread::wait 
}] 

Единственными отличиями являются пробелы. Tcl заботится о белых. Сделай это правильно.

+0

Кроме того, я мог бы использовать ';' в некоторых местах, чтобы исправить это тоже. Его обычно не считают самым большим стилем Tcl, чтобы использовать его много. –