быстрый процесс, кажется, все зависает - PullRequest
0 голосов
/ 08 мая 2020

У меня возникают проблемы с попыткой пинговать некоторые хосты в рамках моего быстрого приложения

процесс выводит на консоль отладки и, кажется, останавливает что-либо после запуска ... не уверен, что я делаю неправильно, так как я несколько раз пытался заставить это работать, я пробовал вызывать:
task.waitUntilExit () Я пробовал task.terminate () ive даже в конце моей попытки task.terminate ( ) task.waitUntilExit ()

следующее настроено для запуска любых процессов, которые мне нужно запустить в приложении, а их несколько, но если я даже не могу заставить процесс ping работать прямо тогда .... .

import Cocoa

class Processes: NSObject {

    func DoTask(command: String, args: [String]) throws -> (String, String, Int32) {
        let task = Process()
        task.launchPath = command
        task.arguments = (args)
        let pipe = Pipe()
        let outputPipe = pipe
        let errorPipe = pipe
        try task.run()
        let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
        let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile()
        let output = String(decoding: outputData, as: UTF8.self)
        let error = String(decoding: errorData, as: UTF8.self)
        task.terminate()
        task.waitUntilExit()
        return (output, error, task.terminationStatus)
    }

}

это вызывается с помощью следующей функции (я собираюсь очистить это и изменить способ его вызова, если я исправлю его, в основном просто разбив его прямо сейчас, чтобы найти, где проблема is)

func PingCheck(IP: String) throws -> (String, String, Int32){
        let command = "/sbin/ping"
        let arguments = ["-c", "1", "-W", "3", "\(IP)"]
        let (output, error, status) = try Processes().DoTask(command: command, args: arguments)
        return (output, error, status)
    }

Я вызываю эту функцию при нажатии кнопки поиска в приложении следующим образом (она извлекает данные из примерно 4 различных REST API и использует эти данные для делать разные вещи)

let IPs = ["\(self.AdbDict["eth0Ip"]!)", "\(self.AdbDict["lomIp"]!)", "\(self.AdbDict["vmIp"]!)"]
        var count = 0
        for IP in IPs {
            let (res, err, stat) = try PingCheck(IP: IP)
            self.pingResult[count]!["Result"] = res
            self.pingResult[count]!["error"] = err
            self.pingResult[count]!["status"] = stat
            count += 1
        }

в качестве примечания, я исхожу из Python, после борьбы за объединение моего приложения, которое было построено в python, с pyGTK для gui (которое я переместил в from python и tkinter для gui), который не будет работать из-за жестких требований среды выполнения, даже со всеми необходимыми правами .... Мне надоело копаться в сложных проблемах с библиотеками python, поэтому я сдался и решил создать swift ... так что я буквально только начал использовать swift через пару недель go, большая часть моего интерфейса завершена, и все мои вызовы API работают нормально, Мне нужно знать, пингуются ли эти IP-адреса после их обнаружения, чтобы приложение знало, может ли оно попытаться сделать с ними что-то другое или сообщить пользователю, что они недоступны. Я пробовал PlainPing, но безуспешно, если IP недоступен. PlainPing переходит к следующему, если он достижим, он останавливается в той же точке ... Я пробовал SwiftPing, но получил ошибку компиляции после добавления его в свой файл pod. поэтому я вернулся к Process, так как SimplePing, похоже, не делает то, что я хочу (я хочу отправить 1 пакет на IP, и если я получу ответ, отлично, если нет, сообщите пользователю, что IP не отвечает на ping)

я также использую Swifty JSON в этой, Sparkle update framework, et c et c, поэтому я сомневаюсь, что это имеет какое-либо отношение к проблеме, с которой я столкнулся, но ... Я отвлекся ...

...