2016-04-06 12 views
0

Durdurulamam gereken durdurulamayan bir Ruby komut dosyası var. İşte aşağıdaki kodu:Ultimate Ruby Komut Dosyası için Öldür

require 'win32ole' 

wsh = WIN32OLE.new("WScript.Shell") 

def fileToArray(file) 
    x = [] 
    File.foreach("#{file}") do |line| 
     x << line.to_s.split('') 
    end 
    return x.flatten! 
end 
tests = fileToArray("C:\\xampp\\htdocs\\x\\Script\\includes\\classes.php") 

sleep 10 
x = 0 
y = tests.length 
while x <= y do 
    send = tests[x] 
    speed = 0.025 
    if x == y 
     print "Test Complete" 
     break() 
    #You guys don't need to see this code, it's just detecting what keys are 
    #in the array and reading them to the file. But important to know that it is incrementing based on sent keys 
    else 
     x += 1 
    end 
end 

Benim sorunum ondan okuyor classes.php 4.000 satır uzunluğundadır olması ve geçmek için uzun bir zaman alır. Eğer berbat olursa, bitene kadar beklemek zorundayım. Her şeyden tamamen çıkmadığı sürece, bu döngü çalışmayı bitirinceye kadar durdurmamın bir yolu yok, CTRL+ALT+DEL Seçenek: Logout. curses'u denedim exit üzerinde gets denedim. CTRL^C da çalışmıyor. Bir çözümde yazmayı tercih ederim, ama aksi halde "öldürün, anahtarları ile öldür" işlemini açıklamak için birkaç tuşa dikkat etmem gerekirdi.

+0

Ctrl + shift + esc ten 'i işlem sürecindeki süreci durdur' denediniz mi? – Esse

+0

Çalışmaya devam ediyor, bu yüzden Görev Yöneticisi'ne tüm menü seçenekleri üzerinden atlamadan erişemiyorum bile –

+0

[Bu] (http://stackoverflow.com/a/14686531/5006469) gördünüz mü? – rdupz

cevap

0

Bir dizide her baytı okuyorsunuz, ne kadar uzun Sonuna kadar koşmaya izin verirseniz dizininizi alır mı? Yüz binlerce kişiyi doldurmak uzun zaman alıyor. Daha iyi bir yol olup olmadığına karar vermek için kodunuzun kalanını görmeli ve neden win32ole nesnesi?

Standart pencere tuşları, jog komut sözcüğünü (Ctrl-c veya Ctrl-break) kesmek için tuşlara basarsa ve görev yöneticisi kullanamazsanız, konsol yine de yanıt vericidir.

Burada yaptığınız şeyi yapan bir komut dosyası. Onu sonsuz bir döngüye koydum, böylece onu sonlandırmak zorundayım. Process.pid işlem kimliğini gösterir. Önceden bir konsol açıp girdiğiniz komut sonlandırmak istediğinizde/f sonlandırmak zorlama içindir

taskkill /f /pid 5532 

takip numarası size komut almak pid

# encoding:utf-8 
STDOUT.sync = true 
s1 = File.read __FILE__ 
puts Process.pid 
class String 
    def to_a 
     while true # endless loop just for testing the kill 
     each_byte.inject([]){|result, char| result << char} 
     end 
    end 
end 

p s1.to_a 

Windows 7 ve Yakut MRI ile test edilmiştir 1.9.3

DÜZENLEME: Yorumlarınız Ben de seni yok ne yapmak istediğini doğru anlamak bir program anahtarlarını göndermek için buraya başka bir yolu dayalı dizgiyi önceden ayırmanız gerekir.

require 'win32ole' 
#for this script Autoit3 must be installed 

s1 = "a string of thousands of characters" 

# activate the correct window with the appclass 
ai.Opt("WinTitleMatchMode", 4) 
appClass = "[CLASS:xxxxxxxx]" # retrieved with AutoIt Window Info 
ai = WIN32OLE.new("AutoItX3.Control") 
ai.WinActivate(appClass) 

# or with the handle 
handle = "[HANDLE:#{ai.wingethandle(appClass)}]" 
ai.WinActivate(handle) 

# send keys, controlkeys or words to the program 
ai.Send('{HOME}') #you can send control keys like that 

s1.each_byte{|char| ai.Send(char); sleep 1} #to send everything char after char 

s1[0..10].each_byte{|char| ai.Send(char); sleep 1} #to send the first 10 chars 
+0

Programın amacı yazmayı taklit etmektir. Bu yüzden win32ole kütüphanesini bir dosyaya anahtar yollamamı ve hızı kontrol etmemi sağladığından kullanıyorum. –

+0

Gördüğünüzde, sendkeyleri kullanıyorsunuz? Bunun için daha iyi bir çözüme sahip olabilirim .. ama daha sonra dizi probleminiz için daha iyi bir çözüm var, cevabımı ekleyeceğim – peter

+0

Bir dizi problemim olduğunun farkında değildim. Kodu biraz daha hızlı hale getirmek için bir durum ifadesine değiştiriyorum ama burada asıl kodun bir bağlantısı var. https://github.com/sinithwar/LazyProjects/blob/master/RubyTypingSimulator.rb –

İlgili konular