Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как можно разделить функции одной программы между несколькими? [D6, WinXP]


Страницы:   1 2

Сергей Ю. ©   (2005-02-13 17:26:00) 

Суть проблемы в следующем: есть мной написанная прога по администрированию работы компьютерного клуба, делает следующее : периодически пингует машины, проверяет связь с клиентскими программами ("закрывалками"), садит/снимает клиентов, ведет их лицевые счета в базе на MS-SQL серваке, считывает траффик на My-SQL сервере и т.д. При 30-50 машинах все работает более-менее стабильно, но вот при увеличении клиентов до 80-100 прога часто "вылетает". Ставить несколько таких программ нехочется, т.к. администратор зала должен следит за всеми машинами "на одном экране". Так вот решил сделать такую вещь - разделить функции этой программы на несколько отдельных программ, думаю так легче будет отследить ошибки и прочие проблемы. Но вот как проводить между ними обмен данными?
Я не проффессионал, так любитель-самоучка. Кто что может посоветовать почитать по этому поводу?
Заранее спасибо за ваши ответы.


Arm79   (2005-02-19 18:27:00) [1]

Ермак ©   (16.02.05 14:46) [22]
Одна поправка. Действительно, медленнее, чем сокеты, но не намного. Во всяком случае, 100 машин - не помеха. У нас так реалтаймовская система на них построена. Несколько тысяч клиентов. Система очередей обеспечивает гарантированнуюдоставку сообщений.

Про многопоточность согласен. Нужна.


Сергей Ю.   (2005-02-19 17:39:00) [2]

Своего прокси у меня нет, на серваке раздающем инет под линуксом стоит какая-то прога которая считает траффик и пишет его в бд, я оттуда беру и сдираю бабки с клиента.


creage   (2005-02-18 19:19:00) [3]

Сергей Ю., может поделишься кодом, который у тебя считает траффик на машинах? Очень надо! Я вот, тоже, пишу такую же прогу, но никак не могу найти, как реализовать свой прокси? Все, не то, все глючное... Может у тебя нормальное!? Поделись!


Ермак   (2005-02-16 14:46:00) [4]

Проблема не в количестве машин, а в ошибке в проге в принципе. Надо ловить ошибку... Если она, как ты говоришь, без выдачи сообщения падает, то выход один - писать в лог-файл...
В принципе, 100 машин - это не ахти какая большая нагрузка. Про почтовые ящики и другие механизмы верхнего уровня забудь - они медленнее, чем сокеты, просто потому, что являются надстройкой над ними.
Писать программу надо было изначально многопоточной, даже пожно открывать несколько сокетов на несколько портов, каждый для своей задачи. Не обязательно своершенно разбивать на несколько прграмм, лучше несколько потоков в одной. Если все-таки захочешь на несколько - то используй файлы проецируемые в память (FIleMapping). Читать ДжРихтера Программирование Вин2000 для профессионалов, Финогенова Программирование в ВИндоус. Правда исходники там на С, но разберешься.

А теперь внимание, есть у меня подозрение, почему у тебя все тормозит и падает. Если ты используешь протокол UDP, то это известная проблема, и обойти ее трудно. Дело в том, что этот протокол низкоуровневый. Если в TCP пакет никуда не денется, даже если твоя прога в этот момент стоит и ковыряется в носу, то в UDP - не успел поймать - улетел пакет... Ну и, естественно, если программа не учитывает это и не передает данные повторно, то логика нгарушается, и все "необъяснимо падает". Используй протокол с соединением - TCP - он надежен и сетку грузит на порядок меньше.


Arm79   (2005-02-16 11:58:00) [5]

MSMQ - MSDN, раздел Platform SDK->Component Services->Message Queueing


try
 ...
except
 on E: Exception
   do begin
     WriteToLog(E.ClassName + ' - ' + E.Message);
   end;
end


Сергей Ю.   (2005-02-15 23:29:00) [6]

Дак именно такого и использую, а какого еще?


Anatoly Podgoretsky   (2005-02-15 21:44:00) [7]

Сергей Ю.   (15.02.05 17:50) [17]
А try такого вида

try
  ...
except
end


Leonid Troyanovsky   (2005-02-15 21:39:00) [8]


> Petr V. Abramov ©   (15.02.05 13:06) [15]
> > Может я задам глупый вопрос, но что такое "Т"?
>  имелось в виду N :))))


Пусть x = T.
Хотя, T может быть малО. Лучше, пусть будет x = N.

--
Regards, LVT.


Сергей Ю.   (2005-02-15 17:50:00) [9]

2 сервера, т.к. один работает с инетом и там считается траффик, другой ms-sql потому-что дб со счетами клиентов работает с 1С, а 1С-ка только с ним и работает.
Про MSMQ где можно почитать?
"писать и читать с 127.0.0.1"? - я по сокетам веду обмен с клиентскими программами в локалке.
try except поставил во всех местах где возникают exception-ы.
Тут другая беда - если раньше она валилась и при этом что-то говорила, то теперь она может просто пропадать ни чего при этом невыдавая на экран, типа ее просто закрыли :(, что-бы это могло быть?


Arm79   (2005-02-15 14:05:00) [10]

Забавно. Я тоже работаю с большими потоками данных, и ничего...

Мне не понятно, зачем используются 2 SQL-сервера, но не суть важно.

По поводу обмена данными между 2 частями программы - сервером и клиентами. Может стоит перейти с сокетов на MSMQ-очереди? Конечно, не думаю, что сокеты плохие, но мне кажется, что очереди для обмена данными для вас подойдут больше, тк меньше ошибок придется обрабатывать... Если надо, могу небольшой модульчик прислать. Только адреса мыла не вижу.

Я лично не стал бы делить свою программу на несколько маленьких. Максимум, использовал бы dll.

По поводу ответа на, собственно, вопрос. WM_COPYDATA. Можно Mapping использовать. MailSlots тоже вроде можно. Вариантов несколько. Можно вроде бы даже с сокетами. Просто писать и читать с 127.0.0.1

ЗЫ Используейте try except и try finally. Очень рекомендую.


Petr V. Abramov   (2005-02-15 13:06:00) [11]

> Может я задам глупый вопрос, но что такое "Т"?
 имелось в виду N :))))


Сергей Ю.   (2005-02-15 08:42:00) [12]

Может я задам глупый вопрос, но что такое "Т"?


Leonid Troyanovsky   (2005-02-14 22:23:00) [13]


> Petr V. Abramov ©   (14.02.05 20:50) [12]
> P.S. Т может оказаться малО


Хотя меня T, вроде(тьфу-тьфу) пока не беспокоило, но, все же,
хотелось уточнить, какой его размер следует считать нормальным?

--
Regards, LVT.


Petr V. Abramov   (2005-02-14 20:50:00) [14]

> но вот при увеличении клиентов до 80-100 прога часто "вылетает".
 Решить задачу "чтоб не вылетела" надо. Если не решите, возникнет проблема "глючит при разделении между >N программами.

P.S. Т может оказаться малО


Сергей Ю.   (2005-02-14 18:29:00) [15]

А чем плох обмен текстом через сокеты?


DVM   (2005-02-14 16:39:00) [16]


> клиенты при подключении/отключении посылают моей программе
> соответсвующие сообщения, их необходимо обработать и изменить
> состояние клиента, произвести записи в БД о счете клиента,
> произвести записи в БД для траффика и т.д. В этоже время
> программа должна обрабатывать данные о счетах рабоающих
> клиентов, обновлять данные траффика и т.д. А клиентов около
> сотни и все что-то шлют, что-то делают.

Клиенты должны обращаться к БД и там интересоваться о своем состоянии и там же выкладывать свои сообщения. Тогда все будет работать быстро.


Сергей Ю.   (2005-02-14 16:32:00) [17]

Забавный народ - программеры, вместо конкретного решения проблемы все предлагают править имеющуюся прогу, мне и самому лень все переделывать (благо деньги за проект уже получены и благополучно пропиты :)), но хочется все сделать красиво, т.е. взять и "переписать все нафик" :) Но чтоб как я хочу, чтоб все раздельно работало!


TUser   (2005-02-14 11:11:00) [18]

Если Try... except нигде не используется, то непонятно, почему она на 30 машинах работает.

В принцыпе, если все написано правильно (что отнюдь не факт), то проблема может быть в слабости самой машины. Поставить помощьнее процессор (или два), памяти добавить - не помогает?

Кстати, как часто клиенты что-нибудь 'говорят' серверу?

PS. Переписать все нафик !)


Anatoly Podgoretsky   (2005-02-14 10:57:00) [19]

Сергей Ю.   (14.02.05 08:51) [5]
try|except нигде неиспользуется,вот тебе и причина, надо использовать.


BiN   (2005-02-14 09:25:00) [20]

Сергей Ю.   (13.02.05 17:26)  
Так вот решил сделать такую вещь - разделить функции этой программы на несколько отдельных программ, думаю так легче будет отследить ошибки и прочие проблемы. Но вот как проводить между ними обмен данными?


C:\Program Files\Borland\Delphi7\Demos\Ipcdemos


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо