Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.18;
Скачать: CL | DM;

Вниз

Потоки   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.033 c
15-1170157396
Janniy
2007-01-30 14:43
2007.02.18
Вакансия программист Delphi+ MsSQL + ASP.NET


15-1169943912
MikePetrichenko
2007-01-28 03:25
2007.02.18
И снова о плагиате


2-1170234910
Beavercrazy
2007-01-31 12:15
2007.02.18
Проблемы переноса из memo в таблицу


1-1166806267
urulet
2006-12-22 19:51
2007.02.18
TabControl


15-1169734576
_ozzy_
2007-01-25 17:16
2007.02.18
General Protection Violation