2010-05-26 8 views
6

Ruby에서 시스템 명령으로 XLS 2 CSV 파일을 변환 중입니다.시스템 명령이 끝날 때까지 기다리는 방법

변환 후 CSV 파일을 처리하지만 프로그램에서 파일을 처리하려고 할 때 변환이 계속 실행되므로 해당 시점에 파일이 존재하지 않습니다.

Ruby가 시스템 명령을 마칠 때까지 기다릴 수 있는지 알려줄 수 있습니까?

sleep 20 

을하지만 더 이상 한 번 걸릴 경우, 그것은 바로 물론되지 않습니다 :

지금은 사용하고 있습니다. 스레드를 사용하는

#Call on the program to convert xls 
command = "C:/Development/Tools/xls2csv/xls2csv.exe C:/TDLINK/file1.xls" 
system(command) 
do_stuff 

def do_stuff 
#This is where i use file1.csv, however, it isn't here yet 
end 
+1

현재 코드의 예를 표시하거나 기능을 설명하십시오. 내가 아는 한, 시스템 콜은 단지 "오프로드"된 것이 아니므로, 어떻게 든 당신이 그것을 오프로드하고 있다고 생각합니다. –

+1

시스템 명령이 성공을 리턴합니까? 시스템의 리턴 값을 변수에 할당 한 후 그 내용을 점검하십시오. 시스템 명령은 동 기적으로 실행해야합니다. –

+0

시스템 (명령)을 변수에 할당하면 immediatly true가 반환됩니다. 그래서 옵션이 없습니다 – Ignace

답변

1

시도 :

은 내가 특별히 할 것은 이것이다

command = Thread.new do 
    system('ruby programm.rb') # long-long programm 
end 
command.join     # main programm waiting for thread 
puts "command complete" 
+12

메인 스레드에서 시스템 명령어를 사용하는 것과 다른 보조 스레드를 어떻게 사용합니까? 시스템 명령이 주 스레드에서 비동기 적으로 실행되면 보조 스레드에서도 실행됩니다. 따라서 시스템 명령이 실행 중일 때 조인은 즉시 완료됩니다. – Aurril

13

루비의 system("...") 방법은 동기; 즉, 종료 코드를 반환하기 위해 호출하는 명령을 기다리고 system은 명령이 0 상태에서 종료되면 true를 반환하고 0이 아닌 상태에서 종료하면 false를 반환합니다.

a = `ls` 

는 현재 작업 디렉토리의 목록을 가진 문자열로 a을 설정합니다 : 루비의 역 따옴표는 Section 명령의 출력을 반환합니다.

그래서 xls2csv.exe는 끝내기 전에 종료 코드를 반환하는 것으로 보입니다. 어쩌면 이것이 Windows 문제 일 수 있습니다. 따라서 파일이 존재할 때까지 반복해야 할 것처럼 보입니다.

until File.exist?("file1.csv") 
    sleep 1 
end 
+0

y ..... 해결 중 – baash05

관련 문제