27
Апр
2021

Доработать параллельный пинг

Пытаюсь сделать параллельный(второй) пинг основному бесконечному пингу который пингует +-100 ip адресов без остановки, если конечно же его не остановить нажатием кнопки при помощи которой он и запускается. Параллельный(второй) пинг должен пинговать отобранные ip адреса которые ушли в отвал при первом пинге и начать пинговать их один раз, после этого снова начать пинговаться первым.

Да - сложно, жду вопросов )

Чтобы получить рабочую модель, а не то, что я пытался сделать, нужно просто раскомментировать всё, что закомментрировано в условиях, а именно в if, ну и закомментировать всё, что не было закомментировано. ;D Вот код - Main.py

#!/usr/bin/env python 3

import sys
import os
import sqlite3
import platform
from des import *
import subprocess
from PyQt5.Qt import *
from PyQt5 import QtCore, QtGui, QtWidgets

#----------------------------------------------- 1 пинг
class WorkThread(QtCore.QThread):
    threadSignal = QtCore.pyqtSignal(int, str, tuple)

    def __init__(self, dictIP):
        super().__init__()
        self.dictIP = dictIP

    def run(self):
        while True:
            for k, v in self.dictIP.items():
                if v[2] == 0:
                    response = os.system("ping " + k + " -n 1 -w 100")
                    self.msleep(20)
                    self.threadSignal.emit(response, k, v)
#            self.finished.emit()

#----------------------------------------------- 2 пинг
class WorkThread_1(QtCore.QThread):
    threadSignal_1 = QtCore.pyqtSignal(int)

    def __init__(self, item_1):
        super().__init__()
        self.item_1 = item_1

        response_1 = subprocess.Popen(["ping", item_1, "-n", "3", "-w", "100"])
        response_1 = response_1.returncode
        self.msleep(20)
        self.threadSignal_1.emit(response_1)
#------------------------------------------------
 
class MyWin(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        
        self.ui.pushButton.clicked.connect(self.startThread)
        self.ui.pushButton_2.clicked.connect(self.clear_plainText)

        self.thread = None

        self.ui.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeToContents)
        self.ui.tableWidget.horizontalHeader().setMinimumSectionSize(0)
        self.ui.plainTextEdit.setReadOnly(True)

#        self.table_index = 0
        self.row_count = 1

        #Подключение к БД
        sqlite_connection = sqlite3.connect("New.db")   
        cursor = sqlite_connection.cursor()
        sqlite_select_query = """SELECT ip FROM ips"""
        cursor.execute(sqlite_select_query)
        records = cursor.fetchall()
        cursor.close()
        sqlite_connection.close()

        # Перебор ip адресов
        for row, value in enumerate(records):
            self.ui.tableWidget.setRowCount(self.row_count)
            item = QtWidgets.QTableWidgetItem(str(value[0]))
            item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable)
            item.setCheckState(QtCore.Qt.Unchecked)
#            self.ui.tableWidget.setItem(self.table_index, 0, QtWidgets.QTableWidgetItem(str(row[0])))
            self.ui.tableWidget.setItem(row, 0, item)
            self.row_count += 1

    def clear_plainText(self):
        self.ui.plainTextEdit.clear()
       
    def startThread(self):
        dictIP = {}
        for row in range(self.ui.tableWidget.rowCount()):
            item = self.ui.tableWidget.item(row, 0)
            if not item.checkState():
                item.setBackground(QtGui.QColor("#b2b2b2"))
            dictIP[item.text()] = (row, 0, item.checkState())

        if self.thread is None:
            self.thread = WorkThread(dictIP)
            self.thread.threadSignal.connect(self.on_threadSignal)
#            self.thread.finished.connect(self.threadFinished)
            self.thread.start()
            self.ui.pushButton.setText("Stop thread")

            style_stop = """QPushButton {
                         background-color: #fa7f72;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_stop)
        else:
            self.thread.terminate()
            self.thread = None
            self.ui.pushButton.setText("Start thread")

            style_start = """QPushButton {
                         background-color: #54e346;
                         }
                         QPushButton:hover {
                         background-color: white;
                         }
                         QPushButton:pressed {
                         color: #626AB0;
                         background-color: #D5D4D4;
                         }"""

            self.ui.pushButton.setStyleSheet(style_start)

#----------------------------------------------- условия
    def on_threadSignal(self, response, k, v):
        #print(response, k, v)
        item = self.ui.tableWidget.item(v[0], v[1])
        #item.setCheckState(QtCore.Qt.Checked)
        if response == 1:
            item_1 = item.text()
            self.thread_1 = WorkThread_1(item_1)
            self.thread_1.threadSignal_1.connect(self.on_threadSignal_1)        
            self.thread_1.start()
            #раскомментировать ниже и закомментировать выше )    
            # item.setBackground(QtGui.QColor("#fa7f72"))

            # sqlite_connection = sqlite3.connect("New.db")
            # cursor = sqlite_connection.cursor()

            # sqlite_select_query = """SELECT * FROM ips WHERE ip = '{}'""".format(item.text())
            # cursor.execute(sqlite_select_query)
            # records = cursor.fetchall()

            # # Вставляем данные в PlainText 
            # self.ui.plainTextEdit.setReadOnly(False)
            # for row in records:
            #     self.ui.plainTextEdit.appendPlainText(str(row[4]) + " | " + str(row[1]) + " | " + str(row[2]) + "\n" +
            #                                           str(row[3]) + "\n")
            # self.ui.plainTextEdit.setReadOnly(True)

        else:
            item.setBackground(QtGui.QColor("#54e346"))    
#----------------------------------------------- 

    def stop(self):
        pass

    def on_threadSignal_1(self, response_1):
        print(response_1)

        if response_1 == 0:

            item_1.setBackground(QtGui.QColor("#f2b71f"))

            sqlite_connection = sqlite3.connect("New.db")
            cursor = sqlite_connection.cursor()

            sqlite_select_query = """SELECT * FROM ips WHERE ip = '{}'""".format(item_1.text())
            cursor.execute(sqlite_select_query)
            records_1 = cursor.fetchall()

            # Вставляем данные в PlainText 
            self.ui.plainTextEdit.setReadOnly(False)
            for row in records_1:
                self.ui.plainTextEdit.appendPlainText(str(row[4]) + " | " + str(row[1]) + " | " + str(row[2]) + "\n" +
                                                      str(row[3]) + "\n")
            self.ui.plainTextEdit.setReadOnly(True)

        else:
            item_1.setBackground(QtGui.QColor("#fa7f72"))

#    def threadFinished(self):
#        self.thread_1 = None
#        self.ui.pushButton.setText("Start thread")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    myapp = MyWin()
    myapp.show()
    sys.exit(app.exec_())

Источник: https://ru.stackoverflow.com/questions/1275665/%D0%94%D0%BE%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C-%D0%BF%D0%B0%D1%80%D0%B0%D0%BB%D0%BB%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9-%D0%BF%D0%B8%D0%BD%D0%B3

Тебе может это понравится...

Добавить комментарий