Форум: "Начинающим";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизПотоки Найти похожие ветки
← →
image (2007-01-31 10:10) [0]Подскажите пожалуйста как правильно переопределить процедуры Execute и Synchronize для потока создаваемого в runtime. Имеется компонент на основе TImage двумя TLabel созданный во время работы приложения и необходимо добавить туда TThread для пинга устройств. TThread добавил без проблем, а вот как объявить вышеуказанные процедуры - не знаю.
← →
tesseract © (2007-01-31 10:20) [1]Зачем Execute переопределять?
Он абстрактный-же, его перекрыть надо. А Synchronize вообще нельзя переопределить, нужно задать функцию и передать в него.
← →
image (2007-01-31 10:27) [2]Значит выходит что нужно протсто написать
type
TStation = class(TImage)
private
FThread : TThread;
procedure Synchronize;
procedure Execute;
или я неправ?
← →
Сергей М. © (2007-01-31 10:28) [3]
> необходимо добавить туда TThread для пинга устройств
Не так уж и необходимо. На ХР успешно работает асинхронный вариант - IcmpSendEcho2()
И не так уж необходимо именно TThread - компонент TIdICMP сам все сделает, там все уже готово для "пинга"
← →
image (2007-01-31 10:31) [4]
> И не так уж необходимо именно TThread - компонент TIdICMP
> сам все сделает, там все уже готово для "пинга"
У меня на форме до 80 компонентов и каждый пингует свой айпи. Не будет ли зависать окно программы?
← →
Сергей М. © (2007-01-31 10:33) [5]
> У меня на форме до 80 компонентов и каждый пингует свой
> айпи
Каких ? И зачем такая куча оных, если вполне можно обойтись максимум десятком ?
← →
image (2007-01-31 10:37) [6]Для контроля сети на работе. Иммиджи - это картинки изображающие устройства, TLabel-ы - айпи и имена, а потоки для сканирования.
← →
Сергей М. © (2007-01-31 10:41) [7]
> Для контроля
А в чем заключается суть контроля ? Просто в периодическом определении факта доступности/недоступности того или иного хоста ?
← →
image (2007-01-31 10:45) [8]
> А в чем заключается суть контроля ? Просто в периодическом
> определении факта доступности/недоступности того или иного
> хоста ?
Да, ты прав. У нас удаленка на DSL-модемах, а качество линий связи сами знаете какое. Поэтому возникает необходимость в постоянном контроле состояния хостов.
← →
Сергей М. © (2007-01-31 10:48) [9]
> возникает необходимость в постоянном контроле состояния
> хостов
Ну, предположим, ты убедился, что такой-то хост в некий момент времени доступен или не доступен. Что дальше ? Как сей факт дальше используется ?
← →
image (2007-01-31 10:51) [10]Далее определяется причина. Если наше оборудование, то предпринимаются соответствующие меры(перезагрузка, замена), а если связь, то поднимаем связистов. Дело в том, что сейчас поезда не отправляются пока не будут переданы данные в управление, а за простой поезда... Поэтому необходима оперативность.
← →
Сергей М. © (2007-01-31 11:02) [11]
> Далее определяется причина
Предположим, юзер интересующего хоста настроил и включил (случайно ли, по злому ли умыслу - не столь важно) файрвол и блокировал при этом входящие icmp-запросы, соответственно твой "пинг" показывает тебе недоступность того хоста, в то время как хост на самом деле доступен. Что дальше ?
> необходима оперативность
Да уж какая там оперативность - сначала тратить время на "пинг" хоста, а затем собственно открывать/закрывать сессию прикладной коммуникации с ним)
Оперативней будет открыть постоянную сессию прикл.коммуникации с интересующим хостом и ловить отказы этой сессии, которые и будут фактами перехода хоста в недоступное состояние. На то есть различные KeepAlive-механизмы.
← →
image (2007-01-31 11:14) [12]
> Оперативней будет открыть постоянную сессию прикл.коммуникации
> с интересующим хостом и ловить отказы этой сессии, которые
> и будут фактами перехода хоста в недоступное состояние.
> На то есть различные KeepAlive-механизмы.
Время на пинг не тратится. Моя программа наподобие NetView постоянно контролирует состояние всех хостов одновременно, через определенные промежутки времени, и в случае отказа какого-нибудь сигнализирует изменением цвета картинки и если в настройках указано, то - звуком. Процесс контроля не прерывается. Так как же на счет моего вопроса?
Как на счет Execute и Synchronize?
← →
Palladin © (2007-01-31 11:25) [13]
Type
TMyThread=Class(TThread)
Protected
Procedure SyncProc1;
Procedure SyncProc2;
Procedure Execute; Override;
End;
Procedure TMyThread.Execute;
Begin
While (Not Terminated) and (SomeOtherCondition) Do
Begin
....
If IsNeededSyncProc1 Do Synchronize(SyncProc1);
If IsNeededSyncProc2 Do Synchronize(SyncProc2);
....
End;
End;
Procedure TMyThread.SyncProc1;
Begin
SomeWorkInMainAppThread;
End;
Procedure TMyThread.SyncProc2;
Begin
SomeOtherWorkInMainAppThread;
End;
← →
image (2007-01-31 11:28) [14]
> Palladin © (31.01.07 11:25) [13]
Спасибо за ответ, но у меня компонент на основе TImage, и в него нужно встроить TThread.
← →
Сергей М. © (2007-01-31 11:32) [15]
> image (31.01.07 11:14) [12]
И все же, imho, "пинг" тут нужен как корове седло.
Состояние хоста точно так же оперативно выясняется по таймаут-отказам сессионного транспортного механизма или по исключениям KeepAlive-механизма.
← →
Palladin © (2007-01-31 11:33) [16]и что? создавай этот поток в конструкторе твоего image да пускай в свободное плавание, на деструкторе останавливай и уничтожай... в чем проблема то?
и что вообще значит "компонент на основе TImage" ?
← →
image (2007-01-31 11:37) [17]
> и что вообще значит "компонент на основе TImage" ?
> type
> TStation = class(TImage)
> private
> FThread : TThread;
................
← →
image (2007-01-31 11:52) [18]Имеется код:
type
TStation = class(TImage)
private
FThread : TThread;
.....................
Как мне правильно объявить/создать процедуры Execute и Synchronize?
← →
Сергей М. © (2007-01-31 11:58) [19]
> image (31.01.07 11:52) [18]
Тебе же в [13] дан пример - что не понятно ?
← →
image (2007-01-31 12:04) [20]Там
Type
TMyThread=Class(TThread)
private
........
а у меня
Type
TMyImage=Class(TImage)
private
FMyThread : TThread;
← →
Сергей М. © (2007-01-31 12:05) [21]Ну и что мешает "у тебя" объявить поле
FMyThread: TMyThread
?
← →
image (2007-01-31 12:19) [22]Где, в каком месте программы?
← →
Сергей М. © (2007-01-31 12:21) [23]
> в каком месте программы?
Как это где ? В декларации твоего класса TMyImage, разумеется...
← →
image (2007-01-31 12:28) [24]Ни чего не получается. А пример можно?
← →
Сергей М. © (2007-01-31 12:33) [25]type
TMyThread=Class(TThread)
... см. [13]
end;
TMyImage=Class(TImage)
private
FThread : TThread;
..
end;
..
FThread := TMyThread.Create(..);
← →
image (2007-01-31 12:38) [26]А, понял. Большое пасибо за ответ.
← →
Сергей М. © (2007-01-31 12:41) [27]А, собственно, зачем ты сотворяешь наследника TImage ? Каковы аргументы в пользу именно такого программного решения ?
К примеру, я утверждаю, что логичней и проще в твоем случае будет поступить так:
type
TStation = class(TObject)
..
FImage: TImage;
FLabel: TLabel;
FPinger: TSomePinger;
..
end;
?
← →
image (2007-01-31 12:45) [28]
> Сергей М. © (31.01.07 12:41) [27]
Может быть и проще если писать с самого начала, но я уже наколбасил 26 килобайт кода, так что переписывать все неохота.
← →
image (2007-01-31 12:48) [29]Правда была попытка в самом начале использовать TObject, но у меня не получилос с его прозрачностью.
← →
Сергей М. © (2007-01-31 12:52) [30]
> я уже наколбасил 26 килобайт кода ..переписывать все неохота
Сначала делаем, потом думаем)
И все же нафиг было наследоваться именно от TImage (почему, к примеру, не от того же TLabel, упомянутого тобой ?) - ну никак я в толк не возьму. Какие такие новые замечательные св-ва приобрел твой наследник по отношению к своему предку ?
← →
Сергей М. © (2007-01-31 12:53) [31]
> использовать TObject, но у меня не получилос с его прозрачностью.
Эт какая такая "прозрачность" у TObject ?
← →
image (2007-01-31 13:06) [32]Удобней таскать мышкой по форме(типа рисовать схему сетки). А насчет свойств сейчас попробую объяснить. Имеется TImage и два TLabel при нем.
Один TLabel для айпи, а второй для имени. Один TLabel сверху, а другой снизу от TImage. Двигаются они вместе с TImage и выравниваются относительно его. Каждый TImage имеет еще TTimer и я надеюсь теперь будут иметь TThread при помощи которых будет осуществляться пинг сетки через определенное пользователем время. Имеется кнопочка для создания этих TImage-й. Есть еще компонента-линия при помощи которой все это дело соединяется(рисуется сеть). Готовая схема сохраняется в ini.
← →
image (2007-01-31 13:08) [33]При плотном расположении элементов на форме перекрывает соседние элементы
← →
Сергей М. © (2007-01-31 13:13) [34]
> image (31.01.07 13:06) [32]
Все это расчудесно, но для чего нужно было лепить своего TImage-наследника ?
Все что ты написал не есть сколь-либо серьезный аргумент в пользу такого решения.
> При плотном расположении элементов на форме перекрывает
> соседние элементы
Св-во Transparent есть и у TImage и у TGraphic - этого вполне достаточно.
← →
image (2007-01-31 13:21) [35]
> Св-во Transparent есть и у TImage и у TGraphic - этого вполне
> достаточно.
> Все это расчудесно, но для чего нужно было лепить своего
> TImage-наследника ?
> Все что ты написал не есть сколь-либо серьезный аргумент
> в пользу такого решения.
Автономность. Все в одном.
> Св-во Transparent есть и у TImage и у TGraphic - этого вполне
> достаточно.
Не помню почему, но что-то у меня там с ним были какие-то проблемы(или у него со мной) :).
← →
Сергей М. © (2007-01-31 13:23) [36]
> Автономность. Все в одном
Почему не в TMyLabel ? Та же пресловутая "автономность")
← →
image (2007-01-31 13:35) [37]Ну в принципе если подумать, то да, но при смене картинки меньше кода.
MyImage.LoadFromFile("FileName");
или
MyLabel.MyImage.LoadFromFile("FileName");
Картинка меняется вручную или при смене состояния хоста(доступен-недоступен).
← →
Сергей М. © (2007-01-31 14:05) [38]
> image (31.01.07 13:35) [37]
Зато больше при смене текста лейбла)
Что совой о пень, что пнем о сову))
А насчет TThread - если ты столь озабочен проблемой "больше кода, меньше кода", то на сей случай и есть TIdICMP.. Для батонокидателей - самое то)
← →
Джо © (2007-01-31 15:14) [39]Какое-то странное решение, ИМХО, с этими пингами.
Почему бы не сделать так — на каждую машину установить клиента, который, через заданные промежутки времени шлет на «сервер» условленную комманду «я живой». Сервер же периодически смотрит на свои списки и отмечает в них те машины, которые долгое время не отвечали. Впрочем, тут надо бы еще обдумать :)
← →
Сергей М. © (2007-01-31 15:27) [40]
> Джо © (31.01.07 15:14) [39]
Дык я ему про Keepalive с самого начала долдоню !
Не внемлет ведь) ... Как о стенку горох) ... Хочу, мол, пинг - и все тут))
← →
Джо © (2007-01-31 15:32) [41]> [40] Сергей М. © (31.01.07 15:27)
> Дык я ему про Keepalive с самого начала долдоню !
Ну, это... «Не осилил», как говорится, всю ветку, сорри :)
Хотя тут уже, по-моему, ветка давно вышла за изначальную тему об азах использования TThread. Но уж больно неочевидное решение выбрано было автором, плюс еще этот TImage...
← →
Германн © (2007-01-31 15:52) [42]
> Но уж больно неочевидное решение выбрано было автором, плюс
> еще этот TImage...
Дык что тут странного? Он же его "колбасил" :)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.049 c