Тогда нужно сделать обычное окно с редактором в нем (для вывода текста).
Как найти символы в тексте?
Сообщений 31 страница 51 из 51
Поделиться3211.02.2014 15:54:57
Пётр, остановился на этом. Может что то не правильно, нужно поправить?
При не доступности вылетает окно, по середине экрана.
Хотелось бы справа, внизу. Не подскажешь как реализовать.
#FILE_IP = 1 #FILE_LOGS = "DRS_log.txt" InitNetwork() CompilerIf #PB_Compiler_Thread=0 MessageRequester("", "Включите поддержку потоков!") End CompilerEndIf Structure WindowParam Window.l x.l y.l InnerHeight.l InnerWidth.l Title.s Flag.l Gadget.l t.l b.l Height.l Width.l Text.s Flags.l EndStructure AddDate_START.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0)) If OpenFile(0, #FILE_LOGS) ; открываем файл лога, если его нет, создаем FileSeek(0, Lof(0)) WriteStringN(0, AddDate_START.s + " старт мониторига...") ;пишем результат CloseFile(0) ;закрываем файл лога EndIf NewList FileContents.s() If ReadFile(#FILE_IP, "IP.txt") While Eof(#FILE_IP) = #False AddElement(FileContents()) FileContents() = ReadString(#FILE_IP) Wend CloseFile(#FILE_IP) Else MessageRequester("Ошибка", "Не найден файл с IP адресами" ,#MB_OK|#MB_ICONERROR) End EndIf Procedure Ping(in_ip.s) Protected *host.hostent, ret.l host.s = in_ip *host = gethostbyname_(host) If *host ret = PeekL(PeekL(*host\h_addr_list)) Else ret = *host EndIf sel_ip = ret ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + 255 *Result = AllocateMemory(ResultSize) *Echo.ICMP_ECHO_REPLY = *Result hFile.l = IcmpCreateFile_() lngResult.l = IcmpSendEcho_(hFile, sel_ip, Space(255), 255, 0, *Result, ResultSize, 2000) If lngResult ProcedureReturn #True Else ProcedureReturn #False EndIf IcmpCloseHandle_(hFile) FreeMemory(*Result) EndProcedure Procedure MessageWindow(*Param.WindowParam) If *Param If OpenWindow(*Param\Window, *Param\x, *Param\y, *Param\InnerHeight, *Param\InnerWidth, *Param\Title, *Param\Flag) SetWindowColor(0, RGB($FF,$00,$00)) StickyWindow(0, 1) LoadFont(1, "Arial", 15) SetGadgetFont(#PB_Default, FontID(1)) TextGadget(*Param\Gadget, *Param\t, *Param\b, *Param\Height, *Param\Width, *Param\Text, *Param\Flags ) ClearStructure(*Param, WindowParam) FreeMemory(*Param) Delay(1500) CloseWindow(0) EndIf EndIf EndProcedure Repeat ForEach FileContents() IP.s = FileContents() AddDate_LOGS.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0)) If Ping (IP) Else If OpenFile(0, #FILE_LOGS) ;открываем файл лога, если его нет, создаем FileSeek(0, Lof(0)) WriteStringN(0, IP.s + " коммутатор не доступен! " + AddDate_LOGS.s) ;пишем результат CloseFile(0) ;закрываем файл лога EndIf *x.WindowParam *x=AllocateMemory(SizeOf(WindowParam)) If *x InitializeStructure(*x, WindowParam) *x\Window.l = 0 *x\x.l = 850 *x\y.l = 550 *x\InnerHeight.l = 400 *x\InnerWidth.l = 180 *x\Title.s = "Мониторинг ДРС" *x\Flag.l = #PB_Window_BorderLess|#PB_Window_ScreenCentered *x\Gadget.l = 1 *x\t.l = 15 *x\b.l = 70 *x\Height.l = 365 *x\Width.l = 30 *x\Text.s = "Коммутатор " + IP + " не доступен!" *x\Flags.l = #PB_Text_Center|#PB_Text_Border If CreateThread(@MessageWindow(), *x)=0 ; Ошибка создания потока. ClearStructure(*x, WindowParam) FreeMemory(*x) EndIf EndIf EndIf Next ForEver
Поделиться3311.02.2014 18:03:48
Если нужно внизу экрана, то следует получить текущие размеры и вычислить требуемые координаты окна.
Нужно не просто создать окно, но и обрабатывать события. Проще всего это сделать если заменить строку Delay(1500) на.
For i=0 To 150 WindowEvent() Delay(10) Next i
Поделиться3411.02.2014 18:44:32
Спасибо Пётр! Сделал так
#FILE_IP = 1 #FILE_LOGS = "DRS_log.txt" InitNetwork() CompilerIf #PB_Compiler_Thread=0 MessageRequester("", "Включите поддержку потоков!") End CompilerEndIf Structure WindowParam Window.l x.l y.l InnerHeight.l InnerWidth.l Title.s Flag.l Gadget.l t.l b.l Height.l Width.l Text.s Flags.l EndStructure AddDate_START.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0)) If OpenFile(0, #FILE_LOGS) ; открываем файл лога, если его нет, создаем FileSeek(0, Lof(0)) WriteStringN(0, AddDate_START.s + " старт мониторига...") ;пишем результат CloseFile(0) ;закрываем файл лога EndIf NewList FileContents.s() If ReadFile(#FILE_IP, "IP.txt") While Eof(#FILE_IP) = #False AddElement(FileContents()) FileContents() = ReadString(#FILE_IP) Wend CloseFile(#FILE_IP) Else MessageRequester("Ошибка", "Не найден файл с IP адресами" ,#MB_OK|#MB_ICONERROR) End EndIf Procedure Ping(in_ip.s) Protected *host.hostent, ret.l host.s = in_ip *host = gethostbyname_(host) If *host ret = PeekL(PeekL(*host\h_addr_list)) Else ret = *host EndIf sel_ip = ret ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + 255 *Result = AllocateMemory(ResultSize) *Echo.ICMP_ECHO_REPLY = *Result hFile.l = IcmpCreateFile_() lngResult.l = IcmpSendEcho_(hFile, sel_ip, Space(255), 255, 0, *Result, ResultSize, 2000) If lngResult ProcedureReturn #True Else ProcedureReturn #False EndIf IcmpCloseHandle_(hFile) FreeMemory(*Result) EndProcedure Procedure MessageWindow(*Param.WindowParam) If *Param If OpenWindow(*Param\Window, *Param\x, *Param\y, *Param\InnerHeight, *Param\InnerWidth, *Param\Title, *Param\Flag) SetWindowColor(0, RGB($FF,$00,$00)) StickyWindow(0, 1) LoadFont(1, "Arial", 15) SetGadgetFont(#PB_Default, FontID(1)) TextGadget(*Param\Gadget, *Param\t, *Param\b, *Param\Height, *Param\Width, *Param\Text, *Param\Flags ) ClearStructure(*Param, WindowParam) FreeMemory(*Param) For i=0 To 150 WindowEvent() Delay(10) Next i CloseWindow(0) EndIf EndIf EndProcedure Repeat ExamineDesktops() DislpayX.l = DesktopWidth(0) DislpayY.l = DesktopHeight(0) DislpayZ.l = DislpayX.l - 430 DislpayC.l = DislpayY.l - 240 ForEach FileContents() IP.s = FileContents() AddDate_LOGS.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0)) If Ping (IP) Else If OpenFile(0, #FILE_LOGS) ;открываем файл лога, если его нет, создаем FileSeek(0, Lof(0)) WriteStringN(0, IP.s + " коммутатор не доступен! " + AddDate_LOGS.s) ;пишем результат CloseFile(0) ;закрываем файл лога EndIf *x.WindowParam *x=AllocateMemory(SizeOf(WindowParam)) If *x InitializeStructure(*x, WindowParam) *x\Window.l = 0 *x\x.l = DislpayZ.l *x\y.l = DislpayC.l *x\InnerHeight.l = 400 *x\InnerWidth.l = 180 *x\Title.s = "Мониторинг ДРС" *x\Flag.l = #PB_Window_BorderLess *x\Gadget.l = 1 *x\t.l = 15 *x\b.l = 70 *x\Height.l = 365 *x\Width.l = 30 *x\Text.s = "Коммутатор " + IP + " не доступен!" *x\Flags.l = #PB_Text_Center|#PB_Text_Border If CreateThread(@MessageWindow(), *x)=0 ; Ошибка создания потока. ClearStructure(*x, WindowParam) FreeMemory(*x) EndIf EndIf EndIf Next ForEver
Поделиться3513.02.2014 14:45:18
Пётр, у меня вопрос.Что такое в диспетчере задач, «Память» (процессы - память)? Когда приложение работает длительное время, набирает объем. Может из-за этого глюки происходят? В частности лог до Гига за ночь.
Я это заметил на Windows XP. На 7 такой графы не нашел.
Поделиться3613.02.2014 17:20:13
Что такое в диспетчере задач, «Память»
Это текущее использование памяти.
Когда приложение работает длительное время, набирает объем.
Какой объем?
В частности лог до Гига за ночь.
Что в нем пишет?
Хотя да, в программе имеется утечка памяти! Вот тут.
lngResult.l = IcmpSendEcho_(hFile, sel_ip, Space(255), 255, 0, *Result, ResultSize, 2000) If lngResult ProcedureReturn #True Else ProcedureReturn #False EndIf IcmpCloseHandle_(hFile) FreeMemory(*Result) EndProcedure
Работа процедуры завершается при вызове ProcedureReturn, а значит строки
IcmpCloseHandle_(hFile) FreeMemory(*Result)
выполнятся не будут. Нужно сделать так.
lngResult.l = IcmpSendEcho_(hFile, sel_ip, Space(255), 255, 0, *Result, ResultSize, 2000) If lngResult ProcResult = #True Else ProcResult = #False EndIf IcmpCloseHandle_(hFile) FreeMemory(*Result) ProcedureReturn ProcResult EndProcedure
И не помешало бы проверять на ошибки, выделение памяти и вызов IcmpCreateFile_().
И в процедуре MessageWindow в данный момент, если окно по той или иной причине не открылось, то память структуры не освободится. Должно быть так.
Procedure MessageWindow(*Param.WindowParam) If *Param If OpenWindow(*Param\Window, *Param\x, *Param\y, *Param\InnerHeight, *Param\InnerWidth, *Param\Title, *Param\Flag) SetWindowColor(0, RGB($FF,$00,$00)) StickyWindow(0, 1) LoadFont(1, "Arial", 15) SetGadgetFont(#PB_Default, FontID(1)) TextGadget(*Param\Gadget, *Param\t, *Param\b, *Param\Height, *Param\Width, *Param\Text, *Param\Flags ) For i=0 To 150 WindowEvent() Delay(10) Next i CloseWindow(0) EndIf ClearStructure(*Param, WindowParam) FreeMemory(*Param) EndIf EndProcedure
Поделиться3713.02.2014 18:59:05
Какой объем?
Около 80, после приложение завершается. Это на ХР. На 7-ке не завершает. Но явно программа делает не то, так как лог очень большого объема.
Что в нем пишет?
В логе куча не доступных машин. Хотя в реальности работали.
Исправлю по вашему совету, протестирую. После отпишусь.
Поделиться3815.02.2014 23:41:03
Пётр, заметил еще одну проблему. Как устранить не знаю.
При работы программы, если отключать сетевую карту или кабель появляется ошибка.
В строке WindowEvent() в процедуре MessageWindow.
Наверное как то нужно проверять состояние сетевой карты?
Поделиться3916.02.2014 19:16:08
появляется ошибка.
В строке WindowEvent() в процедуре MessageWindow.
Что пишет?
Поделиться4016.02.2014 19:30:15
Что пишет?
At least one window shoeld be opened to use this command
Поделиться4124.02.2014 20:34:01
Больше недели тестировал. Глюков с памятью больше не возникало.
Добавил проверку основного шлюза (первая строка в файле IP.txt). При возникновении проблемы с сетевой картой, кабелем или с оборудованием до самого коммутатора выдает ошибку, завершает программу.
С ошибкой в процедуре MessageWindow разобраться не смог.
#FILE_IP = 1 #FILE_LOGS = "DRS_log.txt" InitNetwork() CompilerIf #PB_Compiler_Thread=0 MessageRequester("", "Включите поддержку потоков!") End CompilerEndIf Structure WindowParam Window.l x.l y.l InnerHeight.l InnerWidth.l Title.s Flag.l Gadget.l t.l b.l Height.l Width.l Text.s Flags.l EndStructure AddDate_START.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0)) If OpenFile(0, #FILE_LOGS) ; открываем файл лога, если его нет, создаем FileSeek(0, Lof(0)) WriteStringN(0, AddDate_START.s + " старт мониторига...") ;пишем результат CloseFile(0) ;закрываем файл лога EndIf NewList FileContents.s() If ReadFile(#FILE_IP, "IP.txt") While Eof(#FILE_IP) = #False AddElement(FileContents()) FileContents() = ReadString(#FILE_IP) Wend CloseFile(#FILE_IP) Else MessageRequester("Мониторинг ДРС", "Не найден файл с IP адресами" , #MB_OK|#MB_ICONERROR) End EndIf If ReadFile(0, "IP.txt") ;проверка файла с основным щлюзом Shluz.s = ReadString(0) CloseFile(0) Else MessageRequester("Мониторинг ДРС", "Не найден файл с IP адресами" , #MB_OK|#MB_ICONERROR) End EndIf Procedure Ping(in_ip.s) ; процедура пинга Protected *host.hostent, ret.l host.s = in_ip *host = gethostbyname_(host) If *host ret = PeekL(PeekL(*host\h_addr_list)) Else ret = *host EndIf sel_ip = ret ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + 255 *Result = AllocateMemory(ResultSize) *Echo.ICMP_ECHO_REPLY = *Result hFile.l = IcmpCreateFile_() lngResult.l = IcmpSendEcho_(hFile, sel_ip, Space(255), 255, 0, *Result, ResultSize, 2000) If lngResult ProcResult = #True Else ProcResult = #False EndIf IcmpCloseHandle_(hFile) FreeMemory(*Result) ProcedureReturn ProcResult EndProcedure Procedure MessageWindow(*Param.WindowParam) ;окно пользователю о не доступности машины If *Param If OpenWindow(*Param\Window, *Param\x, *Param\y, *Param\InnerHeight, *Param\InnerWidth, *Param\Title, *Param\Flag) SetWindowColor(0, RGB($FF,$00,$00)) StickyWindow(0, 1) LoadFont(1, "Arial", 15) SetGadgetFont(#PB_Default, FontID(1)) TextGadget(*Param\Gadget, *Param\t, *Param\b, *Param\Height, *Param\Width, *Param\Text, *Param\Flags) For i = 0 To 150 WindowEvent() Delay(10) Next i CloseWindow(0) EndIf ClearStructure(*Param, WindowParam) FreeMemory(*Param) EndIf EndProcedure Repeat AddDate_LOGS.s = FormatDate("%dd.%mm.%yyyy %hh.%ii.%ss", AddDate(Date(), #PB_Date_Year, 0)) If Ping (Shluz) ;проверка на доступность основного шлюза Else MessageRequester("Мониторинг ДРС", "Основной шлюз не доступен"+Chr(10)+"Возможно проблема с сетевым оборудованием "+Chr(10), #MB_OK|#MB_ICONERROR) If OpenFile(0, #FILE_LOGS) ;открываем файл лога, если его нет, создаем FileSeek(0, Lof(0)) WriteStringN(0, "Основной шлюз не доступен " + AddDate_LOGS.s) ;пишем результат CloseFile(0) ;закрываем файл лога Break End EndIf EndIf ExamineDesktops() DislpayX.l = DesktopWidth(0) DislpayY.l = DesktopHeight(0) DislpayZ.l = DislpayX.l - 430 DislpayC.l = DislpayY.l - 240 ForEach FileContents() IP.s = FileContents() If Ping (IP) Else If OpenFile(0, #FILE_LOGS) ;открываем файл лога, если его нет, создаем FileSeek(0, Lof(0)) WriteStringN(0, IP.s + " коммутатор не доступен! " + AddDate_LOGS.s) ;пишем результат CloseFile(0) ;закрываем файл лога EndIf *x.WindowParam *x = AllocateMemory(SizeOf(WindowParam)) If *x InitializeStructure(*x, WindowParam) *x\Window.l = 0 *x\x.l = DislpayZ.l *x\y.l = DislpayC.l *x\InnerHeight.l = 400 *x\InnerWidth.l = 180 *x\Title.s = "Мониторинг ДРС" *x\Flag.l = #PB_Window_BorderLess *x\Gadget.l = 1 *x\t.l = 15 *x\b.l = 70 *x\Height.l = 365 *x\Width.l = 30 *x\Text.s = "Коммутатор " + IP + " не доступен!" *x\Flags.l = #PB_Text_Center|#PB_Text_Border If CreateThread(@MessageWindow(), *x)=0 ; Ошибка создания потока. ClearStructure(*x, WindowParam) FreeMemory(*x) EndIf EndIf EndIf Next ForEver
Поделиться4224.02.2014 22:14:29
С ошибкой в процедуре MessageWindow разобраться не смог.
Из-за нее скомпилированная программа падает или ошибка только при работе в среде PB?
Попробуйте заменить.
For i = 0 To 150 WindowEvent() Delay(10) Next i
На.
For i = 0 To 150 LockMutex(WinMutex) If IsWindow(*Param\Window) WindowEvent() EndIf UnlockMutex(WinMutex) Delay(10) Next i
В начале кода поместите строку.
Global WinMutex = CreateMutex()
Поделиться4324.02.2014 23:20:49
Из-за нее скомпилированная программа падает или ошибка только при работе в среде PB?Попробуйте заменить.
Только в среде PB. В ОС работает нормально.
С Мьютексами отладчик стал ругаться на строку CloseWindow(0).
Закомментировал, ошибка ушла.
Procedure MessageWindow(*Param.WindowParam) ;окно пользователю о не доступности машины
If *Param
If OpenWindow(*Param\Window, *Param\x, *Param\y, *Param\InnerHeight, *Param\InnerWidth, *Param\Title, *Param\Flag)
SetWindowColor(0, RGB($FF,$00,$00))
StickyWindow(0, 1)
LoadFont(1, "Arial", 15)
SetGadgetFont(#PB_Default, FontID(1))
TextGadget(*Param\Gadget, *Param\t, *Param\b, *Param\Height, *Param\Width, *Param\Text, *Param\Flags)
For i = 0 To 150
LockMutex(WinMutex)
If IsWindow(*Param\Window)
WindowEvent()
EndIf
UnlockMutex(WinMutex)
Delay(10)
Next i
; CloseWindow(0)
EndIf
ClearStructure(*Param, WindowParam)
FreeMemory(*Param)
EndIf
EndProcedure
Это правильно? Или строка CloseWindow(0) обязательна? По сути по окончанию цикла, окно всё равно закроется
Поделиться4424.02.2014 23:31:02
Или строка CloseWindow(0) обязательна? По сути по окончанию цикла, окно всё равно закроется
Строка обязательна. Окно само не закроется.
Ругается потому что нет окна с идентификатором 0. Нужно 0 заменить на *Param\Window.
То же касается и SetWindowColor() и StickyWindow().
Строки.
LoadFont(1, "Arial", 15) SetGadgetFont(#PB_Default, FontID(1))
Можно поместить в начале кода и убрать из процедуры.
Поделиться4525.02.2014 02:34:11
Не поясните идею этого кода
For i = 0 To 150 WindowEvent() Delay(10) Next i
Зачем читать события каждые 10 мСек и никак их не обрабатывать?
Если для прорисовки окна, то Петр ранее предлагал такой код
Repeat : Until WindowEvent()=0
А показ окна аж целых 1.5 сек
Delay(1500)
да и 1.5 сек - это для кого?
----------------------------------
А бесконечный цикл пинганья без какой-либо задержки - это тест нагрузки сети? интерфейса?
Как эта программа завершается? Только по Break при отключении шлюза?
----------------------------------
Поясните идею этого кода (добавить к текущей дате ноль лет)
AddDate(Date(), #PB_Date_Year, 0)
----------------------------------
Это сообщение для кого? Что должен делать пользователь получив это сообщение?
CompilerIf #PB_Compiler_Thread=0 MessageRequester("", "Включите поддержку потоков!") End CompilerEndIf
---------------------------------
Поделиться4625.02.2014 08:23:37
Ругается потому что нет окна с идентификатором 0. Нужно 0 заменить на *Param\Window.
То же касается и SetWindowColor() и StickyWindow().
Ошибка осталась. В ОС все нормально, ругается только отладчик.
Поделиться4725.02.2014 08:48:23
А показ окна аж целых 1.5 сек
Окно для инженера СИТ. При пропадании машины увидеть и отреагировать.
А бесконечный цикл пинганья без какой-либо задержки - это тест нагрузки сети? интерфейса?
Как эта программа завершается? Только по Break при отключении шлюза?
Программа запускается при старте ОС. Завершение и не нужно, если только проблемы с сетевым оборудованием. Тест сети.
Это сообщение для кого? Что должен делать пользователь получив это сообщение?
Сообщение для среды PB. Что б настройках компилятора, не забыть галочку «Создать приложение в безопасном потоке»
Поделиться4825.02.2014 08:51:42
Поясните идею этого кода (добавить к текущей дате ноль лет)
Здесь ошибка, исправил
Поделиться4925.02.2014 13:28:33
шибка осталась. В ОС все нормально, ругается только отладчик.
Ну тогда как выход из положения, можно отключить отладчик для этой функции.
DisableDebugger WindowEvent() EnableDebugger
Поделиться5025.02.2014 14:32:21
Ну тогда как выход из положения, можно отключить отладчик для этой функции.
Отключил, только для CloseWindow. Спасибо
Похожие темы
Nodes Monitor | OpenSource | 05.03.2014 |
Ищу наставника (ментора). | PureBasic для Windows | 27.07.2022 |
Вопросы новичка (продолжение…) | Вопросы по PureBasic | 29.06.2024 |
Операции с выделенными файлами (?) | PureBasic для Windows | 14.12.2022 |