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

Вниз

Резидентное консольное application   Найти похожие ветки 

 
alt7   (2003-04-29 13:23) [0]

Какова общая концепция, как сделать? То есть висит себе в памяти, по поступлении информации на сокет, обрабатывает и рассылает другим компам, то есть одновременно и клиент и сервер.

Как сделать чтоб не прога не заканчивала работу?


 
Digitman ©   (2003-04-29 13:25) [1]


> Как сделать чтоб не прога не заканчивала работу


при правильном алгоритме самой "проги" - не пускать юзера к клаве)


 
Dms   (2003-04-29 13:26) [2]

бесконечный цикл


 
alt7   (2003-04-29 13:28) [3]

Будет висеть на сервере резидентом. Ну просто ведь в консольном приложении выполнился код от begin к end и все. А надо, чтоб постоянно висело.


 
pasha_golub ©   (2003-04-29 13:32) [4]

Обрабатывай собственное сообщение от другой проги...
1. Запускаешь консольное в цикле
2. А когда захочешь закрыть, запускаешь другую прогу в которой отправляешь сообщение консольной. Консольная реагирует и себя закрывает.

Ну а шоб постоянно висело while true do <operator>;

Но естесно, так делать не нада! :-)


 
Digitman ©   (2003-04-29 13:35) [5]


> просто ведь в консольном приложении выполнился код от begin
> к end и все


при таких вот "заявлениях" - не рановато ты взялся за клиент-серверные приложения ?) ... может, Паскаль подучить хотя бы еще чуть-чуть ?)


 
Digitman ©   (2003-04-29 13:39) [6]


> alt7


Коль на то уж пошло, то осмелюсь заметить, уважаемый, что и в любом приложении, написанном в Делфи, "выполнился код от begin к end и все")


 
alt7   (2003-04-29 13:41) [7]

to DigitMan: уже лет 5-6. Просто консольные резиденты не писал никогда.


 
Dms   (2003-04-29 13:49) [8]

после 5-6 лет строгого режима создаются "консольные резиденты"


 
alt7   (2003-04-29 13:50) [9]

Хватит языком трепать умники если нечего сказать


 
Anatoly Podgoretsky ©   (2003-04-29 13:51) [10]

begin к end
И это как то препятствует?


 
Digitman ©   (2003-04-29 13:53) [11]


> alt7



> Просто консольные резиденты не писал никогда.


и никогда не напишешь) ... ибо в Win32 нет обособленного понятия "резидентности" : все процессы одинаково "резидентны")

пиши любое приложение в Делфи (хоть консольное хоть неконсольное) - и вот тебе готовый "резидент" !


 
alt7   (2003-04-29 15:03) [12]

А вот такая конструкция: (не срабатывает событие, почему?)

EventClass = class(TObject)
...
procedure IdTelnetDataAvailable(Buffer: String);
...

vIdTelnet.OnDataAvailable := EvClass.IdTelnetDataAvailable;

И в блоке begin .. end:

while true do
begin
Application.ProcessMessages;
end;

OnTimer события срабатывают, а это нет. Почему?


 
Digitman ©   (2003-04-29 15:14) [13]

приводи полностью все что у тебя между begin .. end.


 
alt7   (2003-04-29 15:17) [14]

Нечто вот такое
begin
EvClass := EventClass.Create;
Timer1sec := TTimer.Create(nil); Timer1sec.Enabled := false; Timer1sec.Interval := 1000;
Timer30sec := TTimer.Create(nil); Timer30sec.Enabled := false; Timer30sec.Interval := 30000;
Timer5min := TTimer.Create(nil); Timer5min.Enabled := false; Timer5min.Interval := 299000;
TimerCotStart := TTimer.Create(nil); TimerCotStart.Enabled := true; TimerCotStart.Interval := 1000;
TimerToMod5min := TTimer.Create(nil); TimerToMod5min.Enabled := false; TimerToMod5min.Interval := 1000;
vIdDayTime := TIdDayTime.Create(nil); vIdDayTime.Host := <skip>; vIdDayTime.Port := <skip>;
vIdTelnetSrv := TIdTelnetServer.Create(nil); vIdTelnetSrv.DefaultPort := <skip>;
vIdTelnet := TIdTelnet.Create(nil); vIdTelnet.Host := <skip>; vIdTelnet.Port := <skip>; vIdTelnet.UseNagle := true;


Timer1sec.OnTimer := EvClass.Timer1secTimer;
Timer30sec.OnTimer := EvClass.Timer30secTimer;
Timer5min.OnTimer := EvClass.Timer5minTimer;
TimerCotStart.OnTimer := EvClass.TimerCotStartTimer;
TimerToMod5min.OnTimer := EvClass.TimerToMod5minTimer;
vIdTelnet.OnDataAvailable := EvClass.IdTelnetDataAvailable;
vIdTelnetSrv.OnExecute := EvClass.IdTelnetSrvExecute;
vIdTelnetSrv.OnAuthentication := EvClass.IdTelnetSrvAuthentication;

for vi := 1 to 4 do
arrS_5min[vi] := "0";
Timer30Sec.Enabled := True;
for vi := 1 to 4 do
gl_5minchanged[vi] := "0";
vIdTelnetSrv.Active := true;
vIdTelnet.Connect;

while true do
begin
Application.ProcessMessages;
end;

vIdTelnet.Disconnect;

EvClass.Free;
Timer1sec.Free; Timer30sec.Free; Timer5min.Free; TimerCotStart.Free; TimerToMod5min.Free;
vIdDayTime.Free; vIdTelnetSrv.Free; vIdTelnet.Free;
end.


 
Digitman ©   (2003-04-29 15:26) [15]

1. зачем столько таймеров ? Достаточного одного с интервалов в секунду

2. в чем прелесть реализации приложения как консольного ? все его преимущества ты свел на нет, задействовав модуль Forms


 
alt7   (2003-04-29 15:36) [16]

Forms -> Application Messages -> Чтобы срабатывали события.
Куча таймеров -> Бо хитрая система анализа того что приходит с сокета, надо потом графики строить будет, уже клиентом другим.

Но вот почему не работает событие OnDataAvailable, вот вопрос.
Причем события TIdTelnetServer тоже срабатывают


 
Digitman ©   (2003-04-29 15:40) [17]


> Forms -> Application Messages -> Чтобы срабатывали события.


ну так создай обычное приложение, набросай компоненты на форму - и всех делов ! зачем консоль-то ? что ты выигрываешь в этом случае ? абсолютно ничего !


> Бо хитрая система анализа того что приходит с сокета


все это делается одним-единственным таймером)))



 
alt7   (2003-04-29 15:45) [18]

У меня уже было обычное приложение если ты не догадался, (придет начальство предложу) ;))

Не знаешь системы не говори, как ты одним таймером определишь что прошло 30 секунд, 5 минут с одной точки отсчета?

Вот что насчет события...


 
Digitman ©   (2003-04-29 15:52) [19]


> Не знаешь системы не говори, как ты одним таймером определишь
> что прошло 30 секунд, 5 минут с одной точки отсчета?


)))))))))

ставь интервал = 500 (пол-минуты)

одно событие возникло - прошло полминуты
два события возникло - прошла минута
десять событий возникло - прошло 5 минут

чего ж еще надо-то ?) ставь нужные счетчики в ЕДИНСТВЕННЫЙ обработчик события ЕДИНСТВЕННОГО таймера - и считай на здоровье !))


> У меня уже было обычное приложение если ты не догадался


как же мне, тундре, догадаться, если ты изначально делаешь упор на проблемы именно в конс.приложении ?)
было обычное ? работало ? ну оставь как есть - лучшее враг хорошего !)


 
alt7   (2003-04-29 16:03) [20]

Не все так просто. Таймеры то включаются, то выключаются. Причем то 2 работают 3 отдыхают, то наоборот, то еще как.


 
Digitman ©   (2003-04-29 16:06) [21]


> Не все так просто. Таймеры то включаются, то выключаются.
> Причем то 2 работают 3 отдыхают, то наоборот, то еще как.
>


ну и выставляй переменные-флажки, разрешающие/запрещяющие/обнуляющие соответствующие "счетчики" !

ты ж пойми - навернув косой десяток таймеров ты ресурсы процесса бестолково отнимаешь !


 
alt7   (2003-04-29 16:09) [22]

ну ладно, подумаю. Вот с OnDataAvailable косяк. В исходнике все правильно? Ведь все другие события обрабатываются


 
Digitman ©   (2003-04-29 16:15) [23]


> alt7



> ну ладно, подумаю


вот-вот) ... подумай ! а то сразу демагогию устроил "знаешь систему" - "не знаешь систему"))

а "косяк" проще всего устраняется переносом всего, что начудил здесь, в обычное GUI-приложение на форму)


 
Dmitry Rogov   (2003-04-29 18:13) [24]

ИМХО, такие вещи делаются сервисами.



Страницы: 1 вся ветка

Текущий архив: 2003.05.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
1-34478
BorisUK
2003-04-28 06:51
2003.05.12
Проект из D5 работает не правильно в !


3-34366
NOV
2003-04-22 16:31
2003.05.12
Можно ли сделать такой запрос


8-34514
Makhanev A.S.
2003-02-01 20:42
2003.05.12
как сохранить MP3 тэг версии 2 ?


4-34648
Вадим
2003-03-10 13:24
2003.05.12
немодальное окно без помощи VCL в dll


1-34509
yaric
2003-04-30 00:59
2003.05.12
Как при выполнении проги можно прочитать данные из Version Info