2010-05-26 13 views
6

Konwertuję plik CSV XLS 2 za pomocą polecenia systemowego w Ruby.Jak czekać na zakończenie polecenia systemowego

Po konwersji przetwarzam pliki CSV, ale konwersja jest nadal uruchomiona, gdy program chce przetworzyć pliki, więc w tym czasie nie istnieją.

Czy ktoś może mi powiedzieć, czy możliwe jest, aby Ruby odczekał odpowiedni czas na zakończenie polecenia systemowego?

Teraz używam:

sleep 20 

ale jeśli potrwa to dłużej, raz, to nie jest w porządku, oczywiście.

Co zrobić konkretnie to:

#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

Pokaż nam przykładowy kod lub wyjaśnij funkcję. O ile mi wiadomo, wywołania systemowe nie są po prostu "odciążone", więc myślę, że jakoś je odkładasz. –

+1

Czy polecenie systemu zwraca sukces? Przypisz wartość zwracaną systemu do zmiennej, a następnie sprawdź jej zawartość. Polecenie systemowe powinno działać synchronicznie. –

+0

Kiedy przypisuję system (polecenie) do zmiennej, zwraca ona natychmiast true. Więc to nie jest opcja, albo – Ignace

Odpowiedz

1

spróbuje użyć wątków:

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

W jaki sposób używa się wątku dodatkowego innego niż polecenie systemowe w wątku głównym? Jeśli polecenie systemowe działa asynchronicznie w głównym wątku, będzie również w wątku dodatkowym. Łączenie zakończy się natychmiast, gdy polecenie systemowe będzie nadal działać. – Aurril

13

system("...") metoda Ruby jest synchroniczny; to znaczy czeka na polecenie, które wywołuje, aby zwrócić kod zakończenia, a system zwraca wartość true, jeśli polecenie zakończyło się statusem 0, a false, jeśli zostało zakończone ze statusem innym niż 0. backticks Ruby powrót wyjście commmand:

a = `ls` 

ustawi a do łańcucha z listą bieżącego katalogu roboczego.

Wygląda więc na to, że xls2csv.exe zwraca kod zakończenia, zanim zakończy działanie, co powinien. Być może jest to problem z systemem Windows. Wygląda na to, że musisz mieć pętlę, dopóki plik nie istnieje:

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

rozwiązywanie dla y ..... – baash05

Powiązane problemy