Змея / Говнокод #5354 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
#! /usr/bin/python2.4
# -*- coding: utf-8 -*-
'''
from Tkinter import *
import subprocess
import Queue
import threading

class ifStatThreadClass(threading.Thread):
    """класс потока с ifstat"""
    def __init__(self,breakCount):
        global listBox
        selectedIface=listBox.curselection()
        if not selectedIface: selectedIface=0
        self.ifaceName=listBox.get(selectedIface);
        self.breakCount=breakCount
        threading.Thread.__init__(self)
        
    def run(self):
        global queue
        global stop_event       
    # рабочий тред, запускает ifstat на вывод 20 строк    
        global listBox
        cmd="ifstat -i %s 1 %s"% (self.ifaceName, self.breakCount,)
        print "Запускаю: %s"%cmd
        PIPE = subprocess.PIPE
        p = subprocess.Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE,
                stderr=subprocess.STDOUT, close_fds=True)
        #пока нет стоп-события ловим строки из стдоута
        if (stop_event.is_set()): print "stop event detected!"
        while not stop_event.is_set():
            s = p.stdout.readline()
            if not s: break
            if self.breakCount==0: break
            self.breakCount-=1
            #кладем очередную строку в очередь
            queue.put(s)
            print s,
        
def startIfStat():
    """ стартуем рабочий тред"""
    global stop_event
    global ifStatThread
    ifStatThread = ifStatThreadClass(10)
    try:
        stop_event.clear() 
        ifStatThread.start() 
    except: 
        print "Не могу запустить поток! Может, он уже запущен?"
        stop_event.set()
    
    #вот тут стартуем
       
            
def stopWorker():
    """создаем стоп-событие"""
    print("Тпырррр!")
    global stop_event
    global ifStatThread
    # установим событие останова
    stop_event.set()
    
def ifStatResultUpdater():
    """обновлялка текстового поля из очереди query"""
    global queue
    global stop_event
    global ifStatResult
    global ifStatThread
    global emptyQueueCounter
#    print("updater")
#    ifStatResult.configure(text=time.strftime('%H:%M:%S'))
    #только если не было стоп-события 

    if not stop_event.is_set():
        if ifStatThread.isAlive(): print "Поток еще жив!"
        else: print "Потока в живых не обнаружено"
        s='' 
        try:
            #берем из очереди строку и выводим на лейбл
            print 'Что у нас в очереди? ',
            s = queue.get_nowait()
            print "а в очереди вот:",s
            ifStatResult.configure(text=s)
        except Queue.Empty:
            print('ничего в очереди нету(')
            if (emptyQueueCounter>2):
                print('аааа.. похоже, все умерли... щас заново запущу!') 
                startIfStat()
                emptyQueueCounter=0                
            emptyQueueCounter+=1
            
        #если стоп-события не было, запускаем эту же функцию через секунду
    root.after(1000,ifStatResultUpdater)

queue = Queue.Queue() #создаем очередь
emptyQueueCounter=0

Мой первый (мало-мальски серьезный) опыт на питоне. Выводит список из 3х интерфейсов, по нажатию Старт запускает тред с ифстатом, выводит в окошко результаты. Кривинько-косо, но работает)
Если есть замечания как криво написано и предложения как лучше, жду комментарии.
P.S. до этого писал на пхÐ%BF, D1‚ак что не пинайте сильно)

Запостил: hakimovis hakimovis, (Updated )

Комментарии (3) RSS

  • Ну да, все не вместилось, но самое интересное здесь - запуск, останов, перезапуск потока. Ниже просто описывается интерфейс на Tkinter
    Ответить
  • Зачем использовать global при вызове метода? Да и вообще можно было легко обойтись без глобальных. Эх
    Ответить
    • можно было бы передавать их в функции в виде аргументов, но я еще не уверен, какие из них изменяемые, т.е. передаются по ссылке. Сделал так, наверняка.
      Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8