Приветствую Вас Гость | RSS
Главная страница | Регистрация | Вход
Начало » 2011 » Февраль » 15 » Продолжая эксперимент...
Продолжая эксперимент...
Добрался наконец до серверной части своей экспериментальной "поделки" - клиент-серверной передачи данных из БД1 в БД2.
Проверил результат на локальной машине (коннект по адресу 127.0.0.1) и по локалке (две машины в сети 192.168.Х.Х) - коннект есть! 
Значится сокетная часть практически закончена. Что радует.

Что НЕ радует:

1. Сервер принимает события только в режиме stThreadBlocking... 
т.е. - асинхронный тип. Вследствие того что я собираюсь из каждого соединения производить некие запросы в БД1 - ИМХО потокобезопаснее было бы организовать монопольный доступ к БД1 от каждого соединения. Видимо будем рыть в сторону мьютексов - для обеспечения безопасности "критической области" - БД1.

2. Сервер фиксирует лишь события OnGetSocket и OnAccept. 
В смысле - почему-то до события OnClientConnect дело не доходит, хотя со стороны клиента фиксируется установление соединения. Правда оно сразу же разрывается (что также не приводит к возникновению события OnClientDisconnect со стороны сервера). Доберусь до передачи данных - посмотрим что будет.

3. Ошибка уровня privileged instruction...
Это - самое неприятное. Сначала чуток об архитектуре "приложения": Что серверный сокет, что клиентский - запускаются в отдельных потоках, т.е. основная VCL-форма постоянно активна и воспринимает пользовательский ввод, а также - отображает события сокетов из потоков (реализовано через Synchronize). Ошибка же происходит в момент завершения работы клиентского потока - в конце процедуры Execute.

Код:

procedure TMyWinSockThread.Execute;
begin
if Not Assigned(Socket) then
     Socket := TClientSocket.Create(ThrOwner);
................
if Assigned(Socket) then
  begin
     Socket.Close;
     FreeAndNil(Socket); - ЗДЕСЬ ОШИБКА, блин...
  end;
end;

т.е. - на завершении потока идет удаление созданного сокета, а после уже НИЧЕГО нет. Но сокет удаляться не желает.
При этом - такая же конструкция но с серверным сокетом прекрасно отрабатывает.

Код:

procedure TServerWinSockThread.Execute;
begin
      if Not Assigned(Socket) then
          Socket := TServerSocket.Create(ThrOwner);
................
      if Socket.Active then
         Socket.Close;
      if Assigned(Socket) then
         FreeAndNil(Socket); - А ЗДЕСЬ НЕТ ОШИБКИ...
end;

Вот такая загогулина... Чешу репу и медитирую над кодом.

Категория: Проекты | Просмотров: 1243 | Добавил: homeship | Рейтинг: 0.0 |
[ Разделы новостей ]
Ракеты [5]
Любительское, экспериментальное ракетостроение.
"За жисть..." [12]
Об окружающем, о наболевшем, о всяком...
Проекты [7]
Программирование, разработка, прогресс текущих проектов.
Homeship [10]
Статус основного проекта, которому посвящен сайт

[ Форма входа ]
Логин:
Пароль:

[ Календарь новостей ]
«  Февраль 2011  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28

[ Статистика ]

Рейтинг@Mail.ru

Онлайн всего: 1
Гостей: 1
Пользователей: 0

[ Погода ]
 
 
Copyright Homeship Ind. © 2006 Сделать бесплатный сайт с uCoz