Тогда нужно сделать обычное окно с редактором в нем (для вывода текста).
Как найти символы в тексте?
Сообщений 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 |