Форум программистов, компьютерный форум, киберфорум
Ruby
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 27.11.2016
Сообщений: 7
1

утечка памяти, чтение процессов и кое что по мелочи

27.11.2016, 16:23. Показов 1305. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
здравствуйте Уважаемые участники форума.
решил я начать изучать RUBY (ранее баловался написанием на Pascal. давно это было), и тут же столкнулся с огромной кучей непредвиденных препятствий. попытался справиться самостоятельно (т.к. привык искать инфу в интернете. и если честно, это первое моё обращение за помощью на форум).. но не тут - то было. либо слишком сложно всё изложено, либо не там ищу.. но факт : с поставленной задачей самостоятельно не справляюсь.
теперь собственно вопросы.
начал писать программу озвучивающую сообщения Pidgin.
1-я засада: не смог найти как читать сообщения(поток) непосредственно из самой программы Pidgin.
ладно. финт ушами. прочту мессаги из истории сообщений и озвучу.
2-я засада: не смог найти как читать последнюю строку файла средствами самого RUBY.
ок. финт ушами. добавляю команды bash.
в итоге получается такой вот монстр:

Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/ruby
                                    
                                    
`echo  "Говорилка включена"| RHVoice | aplay `         # озвучка включения пограммы
 
system(" lsof +D ~/.purple/logs |grep pidgin | cat > RabFile.txt")  # определяем какой процесс и
                                                                                                # какой файл открыты и записываем вывод 
                                                                                                # во временный файл RabFile.txt
 
                                       # если старый файл "adres.txt" существует, то удоляем его 
# File.delete( "adres.txt" ) if File::exists?( "adres.txt" )                    
 
 
                                                   # составляем новый список адресов читаемых(прослушиваемых) файлов
 
$vvod = Array.new                           # массив старых строк. для сравнения
time = Time.now                                 # запускаем счётчик времени
 
 
def newAdress
 
    adresArr = Array.new                    # инициализация массива адресов
                                    # (активные контакты. которых мы слушаем)                                       
    $kString = 0                        # счётчик строк файла проверяемых адресов            
 
    file = File.new("RabFile.txt")                  # открываем RabFile для чтения
    file.each do | line |                       # пока в файле есть строки, используем их по очереди
        f = line                        # копируем в переменную f  для дальнейшей обработки
#       puts " Сторка RabFile : "                                     
#       puts f                                          # вывод f для отладки
 
        j = f.length                        # узнаём длинну строки переменной
        i = 0                           # новый счётчик
        while f[ i ] !="/" do                       # пока не увидем символ / в строке будем выполнять:
            i += 1                                  # увеличиваем счётчик на 1
            #puts i                 # вывод значения счётчика для отладки
            #puts f[ i ]                    # вывод перебераемого символа для отладки
            #sleep 0.2                  # пауза, чтобы видеть что и как перебирает
        end                         # конец цикла 
        
        adresArr[ $kString ] = f[ i...j ]           # записываем оставшиеся в строке символы в файл adres
        #puts " Адрес № " , $kString , " : \n"   # порядковый номер выводимого адреса. для отладки
        #puts adresArr [ $kString]          # вывод  adres для отладки
        $kString += 1                   # на одну строку (один активный контакт) больше    
 
        for nString in 0..($kString-1) do       # начинаем перебирать адреса по порядку
            $vvod[ nString ] = "pusto"      # записываем "pusto" в старую строку с порядковым номером адреса
            ad = File.open( "adres#{ nString }.txt", "w")   # открываем файл с порятковым номером адреса
            ad.puts  adresArr[ nString ]                # пишем в него адрес
            ad.close                            # закрываем
        end
 
    end     
    
end
 
 
 
 def goOzvuchka(line , nString)                     # запуск озвучки строки line с порядковым номером nString
            puts "listing :" , line                         # вывод новой строки. для отладки
            puts "vvod :" , $vvod [ nString ]           # вывод старой строки. для отладки
            j = line.length                     # узнаём длину прочтённой строки
            i = -1                              # новый счётчик символов строки
            s = 0                               # счётчик пробелов (для выделения фразы)
            while s < 3  do                         # пока пробелов < 3х
                i += 1                          # увеличиваем счётчик символов
                if line[ i ] == "\s" then               # если символ с номером i равен пробелу, то
                    s += 1                  # увеличиваем счётчик пробелов на 1
                end
    
                # print i                   # вывод значения счётчика для отладки
                # print line[ i ]               # вывод перебираемого символа для отладки
                # sleep 0.1                 # пауза, чтобы видеть что и как перебирает
            end 
                                                        # пишем фразу в файл p(порядковый номер собеседника).txt
            gov = File.open( "p#{nString}.txt" , "w")  # открываем файл фразы с порядковым номером nString
            gov.puts  line[i...j]               # пишем в него саиу фразу (без времени и имени)
            gov.close                       # закрываем файл
        
            if $vvod[ nString ] != "pusto" then                 # если прочтение не первое, то..
                system(" cat p#{nString}.txt|RHVoice|aplay")    # озвучка фразы
            end
        
            $vvod[ nString ] = line                     # заносим прочитанную строку в массив для последующего сравнения
 end        
 
 
 
 
                                    # проверка подключения новых собеседников                               
def newContacts
    system(" lsof +D ~/.purple/logs |grep pidgin | cat > RabFileNew.txt")       # определяем какой процесс и
                                                                                                            # какой файл открыты и записываем вывод 
                                                                                                            # в новый файл RabFileNew.txt
                # сравнение старого и нового списков рабочих процессов
    if File.size("RabFile.txt") != File.size( "RabFileNew.txt") then            # если не совподают то..
        if File.size("RabFile.txt") < File.size( "RabFileNew.txt") then     # если старый файл < нового, то..
            ` echo "новый контакт активен"|RHVoice|aplay`        # озвучиваем, что "активен новый контакт"
            else `echo "контакты не активны" |RHVoice|aplay`       # иначе озвучиваем, что "контакты не активны"
        end
        File.delete("RabFile.txt")                          # удаляем старый (рабочий) файл процессов
        File.rename("RabFileNew.txt" , "RabFile.txt")               # помечаем новый файл как старый (рабочий)
        newAdress                                                                                   # обновляем список адресов читаемых файлов
    end
end 
 
                                    # собственно программа.
                                                
newAdress                                               # опрос активных контактов и составления списка адресов
 
loop do                                                 # бесконечный цикл
    if  $kString > 0 then                                   # если в файле строк больше, чем 0 (не пустой) , то ..
        for nString in 0..($kString-1) do                       # перебираем номера строк файла адресов
        
            line = `tail  -n  1 $(cat adres#{ nString }.txt)`                   # читаем  последнюю(новую) строку файла с 
                                                                                                        # адресом № nString
            # puts line                                 # вывод строки. для отладки
            if $vvod[ nString ] != line  then                       # если старая строка файла не равна только что прочтённой то..
                goOzvuchka(line , nString)                  # озвучиваем новую строку
            end 
 
        end     
        
    end
    sleep 0.5                                   # пауза полминуты. что бы не грелся проц
    period = Time.now                           # сравниваем время со счётчиком
    if period - time > 10 then                      # если прошло > 10 секунд, то..
    time = Time.now                             # сбрасываем счётчик времени
    newContacts                             # проверяем новые активные контакты
    end
#   puts time                                   # смотрим когда запустили(сбросили) счётчик времени. для отладки
#   puts period                                 # и для сравнения настоящее время. для отладки
#   puts " активных контактов : ", $kString                    # смотрим количество активных контактов. для отладки
end
.. но и тут всё не слава богу.
1. не смог избавиться от глобальных переменных.
2. новый список процессов RabFile.txt иногда дублируется. соответственно озвучка тоже повторяется
3. и самое сложное. каждую секунду процесс запущенной программы сжирает дополнительно 16- 20 байт оперативной памяти. т.есть если сейчас он хавает 7000 байт то через 10 секунд он уже будет хавать 7160 - 7200 байт.

вот,собственно. много ещё вопросов по исполнению. но если кто может (или хочет) дать совет как обойти данные препятствия буду премного благодарен.
с Уважением, Макс.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2016, 16:23
Ответы с готовыми решениями:

Чтение памяти из процессов
Здравствуйте , знаю c++ на базовом уровне , хочу научится писать читы для CS:GO. Начать хочу с...

Чтение\запись памяти для x64 процессов
Читал память из одной онлайн игры для x32 битной версии на C# - все путем с помощью ...

Утечка памяти (или что-то еще)
Всем привет! Подскажите, пожалуйста, такой момент. Есть главная активность, на ней - 1 картинка....

TStringList ** утечка памяти, Что делать?
Вот пример, тут возникает утечка памяти. Как правильно оформить удаление в функции test()???...

5
the hardway first
Эксперт JS
2461 / 1836 / 906
Регистрация: 05.06.2015
Сообщений: 3,603
28.11.2016, 11:15 2
minimusss, смотрите, что я вам нашел. К сожалению linux нет под рукой, так бы тоже побаловался с
Цитата Сообщение от minimusss Посмотреть сообщение
писать программу озвучивающую сообщения Pidgin

1
0 / 0 / 0
Регистрация: 27.11.2016
Сообщений: 7
28.11.2016, 12:22  [ТС] 3
j2FunOnly, спасибо Вам огромное за ответ, предоставленную информацию и вектор(направление) в котором следует двигаться дальше. Теперь, определённо, будет полегче)

с Уважением, Макс.
0
0 / 0 / 0
Регистрация: 27.11.2016
Сообщений: 7
02.12.2016, 09:09  [ТС] 4
Раз уж это моя первая (юбилейная) тема, не побоюсь этого слова, в жизни (наичистейшая правда), считаю своим долгом закрыть её достойно. Возможно, кому-нибудь да сгодится.
Так вот.. Перерыв огромную часть тРУнета, четно говоря, нашёл там очень мало информации по данной теме. Либо проги (примеры) идут на питоне, либо тему затрагивают вскользь (либо и то и другое). Проблема была правильно опросить метод и вытащить из него переменную message (засада чисто синтаксическая). И всё же нашёл на одном из буржуйских сайтов статейку (даже не статейку,а несколько примеров), благодаря которой(ым), смог собрать в кучу, растёкшиеся по всемирной паутине мозги, и кое-что понять. (как оказалось, эта страничка и на тРУнете имеется). https://mhvlug.org/sites/defau... s_ruby.pdf
В итоге получилось такое:
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/ruby
 
# From the ruby-dbus project
require 'dbus'
# System Bus is for OS events, shared for all users
system_bus = DBus::SystemBus.instance
# Session Bus is per desktop instance
session_bus = DBus::SessionBus.instance
 
 # Get the pidgin service
 pidgin_dbus = session_bus.service("im.pidgin.purple.PurpleService")
 # Get the object from this service
 pidgin = pidgin_dbus.object("/im/pidgin/purple/PurpleObject")
 pidgin.introspect
 pidgin.default_iface = "im.pidgin.purple.PurpleInterface" 
 
pidgin.on_signal("ReceivedImMsg")  { |account, sender, message, conversation, flags|
    `echo #{[message]} |RHVoice|aplay`
}
    
pidgin.on_signal("SendingImMsg")  { |account, reciever, message|
    `echo #{[message]} |RHVoice|aplay`
}
            
        `echo "Добр+о пожаловать в Pigin"|RHVoice|aplay`
        m = DBus::Main.new
        m << session_bus
        m.run
Для сравнения с прогой(глючной прогой) из первого поста.
Так как строк тут не много, из них моих всего 3 штуки комментировать не стал (буржуйские комментарии оставил).
Прогу тестировал день. Работает. Запуск прописал скриптом и вывел на иконку PIDGINа, т.к без запущенного PIDGINа прога выдаёт ошибку. Правда если оба были запущенны, а потом закрыть и открыть только PIDGIN (не закрывая при этом прогу) говорилка продолжает работать как ни в чём не бывало.
Ну вот пожалуй и всё.
Ещё раз Огромное спасибо товарищу j2FunOnly. Выручил!
DBus - Cила!

Вопрос считаю решённым. Поставленная задача выполнена.
Прошу модераторов закрыть тему.

С Уважением, Макс.
0
the hardway first
Эксперт JS
2461 / 1836 / 906
Регистрация: 05.06.2015
Сообщений: 3,603
02.12.2016, 12:22 5
Цитата Сообщение от minimusss Посмотреть сообщение
Прошу модераторов закрыть тему.
Зачем?
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/env ruby
 
require 'dbus'
 
# Session Bus is per desktop instance
session_bus = DBus::SessionBus.instance
 
# Get the pidgin service
pidgin_dbus = session_bus.service('im.pidgin.purple.PurpleService')
# Get the object from this service
pidgin = pidgin_dbus.object('/im/pidgin/purple/PurpleObject')
pidgin.introspect
pidgin.default_iface = 'im.pidgin.purple.PurpleInterface'
 
rhvoice = proc do |_account, _sender, message, _conversation, _flags|
  `echo #{[message]} |RHVoice|aplay`
end
 
pidgin.on_signal 'ReceivedImMsg', &rhvoice
pidgin.on_signal 'SendingImMsg', &rhvoice
 
rhvoice[nil, nil, 'Добро пожаловать в Pidgin']
m = DBus::Main.new
m << session_bus
m.run
Вопрос: почему `echo #{[message]} | ...`, а не `echo #{message} | ...`?

Добавлено через 1 час 19 минут
можно еще дальше пойти...
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# ...
 
module RHVoice
  module PidginDBus
    module SignalHandler
      class << self
        def to_proc
          def self.to_proc
            @proc
          end
 
          puts 'aah, that crazy ruby\'s object-oriented model %-]'
          @proc = proc do |account, recepient, message, conversation, flags|
            RHVoice.say message
          end
        end
      end
    end
  end
 
  def self.say(msg)
    puts msg
  end
end
 
pidgin.on_signal 'ReceivedImMsg', &RHVoice::PidginDBus::SignalHandler
pidgin.on_signal 'SendingImMsg', &RHVoice::PidginDBus::SignalHandler
 
RHVoice.say 'Добро пожаловать в Pidgin'
m = DBus::Main.new
m << session_bus
m.run
1
0 / 0 / 0
Регистрация: 27.11.2016
Сообщений: 7
02.12.2016, 18:26  [ТС] 6
Цитата Сообщение от j2FunOnly Посмотреть сообщение
Зачем?
был уверен, что так положено.

Цитата Сообщение от j2FunOnly Посмотреть сообщение
Вопрос: почему `echo #{[message]} | ...`, а не `echo #{message} | ...`?
что-то думал, что в кв.скобках вся синтаксическая фишка и заключается. вроде проверял без них. под утро уже дело было. напутал что-то. стопудово.
сейчас проверил без кв. скобок. всё нормально работает. спасибо за подсказку (начинаю только RUBY осваивать. и путаюсь оч. сильно. в точках особенно).

решил поставить прогу другу. ставлю - не рабит. вижу в терминале(он в др. городе живёт) мои мессаги озвучивает, а его, родные, молчит. ну я в панике! чё делать? как проверить? почему так? и всё в таком роде..
вставляю Ваш код... то же самое! я в осадке. благо проги короткие.. всё сверил, перепроверил.. всё норм. должна работать!
оказалось.. он с трубы писал.
Ваш код, j2FunOnly, так и остался на компе друга работать. с Вашего позволения. на своём свой гоняю.
кстати, спасибо за код!
первый листинг смотрится и читается приятнее моего (наука мне на будущее). а второй , ну очень любопытный код. будем поизучать.

однако возник вовпросец. даже 2! (ответы, если таковые будут, устроят да или нет).
1. в буржуйском я не силён, поэтому в документацию сильно не вникал(да и мало её. документации). ведь можно же как-то озвучить то, что Pidgin выводит на свой экранчик (диалоговое окно). как это будет? при открытии диалога или в закрытом диалоге она тоже надпися видит?
2. если обрабатывать инфу с экрана Pidginа (диалоговое окно), это же надо опять будет время сообщения отсеивать. т.е. опять этот гемор с обработкой текста?
это не критично, но всё же. вдруг кто сталкивался или знает как чё..
пока всё.

с Уважением, Макс.
0
02.12.2016, 18:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2016, 18:26
Помогаю со студенческими работами здесь

Утечка памяти или что? Валидность итератора
вообщем падает задача через раз, вроде бы в 44 строке, вместо str+= надо бы по идее метод...

Утечка памяти, что если не освободить зарезервированную память?
Я не понимаю этого вообще. Получается, если я напишу программу с такой ошибкой специально и буду...

HttpWebRequest, расход памяти непомерно больших объемов и , как следствие, утечка памяти
Добрый вечер. Мне была поставлена такая задача. Написать приложение, которая загружает из списка...

Вектор, утечка памяти, функция создания и выделение памяти
Здравствуйте. Есть проблема. функция malloc выделяет память лишь в функции CreateVector(), и при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru