Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1170078591
NPC
2007-01-29 16:49
2007.02.18
Связи между таблицами


2-1170164743
Хеад
2007-01-30 16:45
2007.02.18
Помогите решить задачу на Turbo Pascal


15-1169771344
IMHO
2007-01-26 03:29
2007.02.18
Viewer для BDB файлов


2-1169918419
Mozgan
2007-01-27 20:20
2007.02.18
Как подсчитать количество открытых окон?


2-1170091537
_newman_
2007-01-29 20:25
2007.02.18
Как узнать путь к директории из которой запущена программа.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский