А. Григорьев - О чём не пишут в книгах по Delphi

Здесь есть возможность читать онлайн «А. Григорьев - О чём не пишут в книгах по Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: СПб, Год выпуска: 2008, ISBN: 2008, Издательство: БХВ-Петербург, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

О чём не пишут в книгах по Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «О чём не пишут в книгах по Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Рассмотрены малоосвещённые вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные механизмы их работы, особенности для протоколов TCP и UDP и др. Большое внимание уделено разбору ситуаций возникновения ошибок и получения неверных результатов в "простом и правильном" коде. Отдельно рассмотрены особенности работы с целыми, вещественными и строковыми типами данных, а также приведены примеры неверных результатов, связанных с ошибками компилятора, VCL и др. Для каждой из таких ситуаций предложены методы решения проблемы. Подробно рассмотрен синтаксический анализ в Delphi на примере арифметических выражений. Многочисленные примеры составлены с учётом различных версий: от Delphi 3 до Delphi 2007. Прилагаемый компакт-диск содержит примеры из книги.
Для программистов

О чём не пишут в книгах по Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «О чём не пишут в книгах по Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

// Начинаем бесконечный цикл

repeat

// Ожидание события с 15-секундным тайм-аутом

WaitRes :=

WSAWaitForMultipleEvents(2, @FEvents, False, 15000, False);

case WaitRes of

WSA_WAIT_EVENT_0:

// Событие FEvents[0] взведено - это означает, что

// сервер должен остановиться.

begin

LogMessage('Сервер получил сигнал завершения работы');

// Просто выходим из цикла, остальное сделает код после цикла

Break;

end;

WSA_WAIT_EVENT_0 + 1:

// Событие FEvents[1] взведено.

// Это должно означать наступление события FD_ACCEPT.

begin

// Проверяем, почему событие взведено,

// и заодно сбрасываем его

if WSAEnumNetworkEvents(FServerSocket, FEvents[1], NetEvents) = SOCKET_ERROR then

begin

LogMessage('Ошибка при получении списка событий: ' +

GetErrorString);

Break;

end;

// Защита от "тупой" ошибки - проверка того,

// что наступило нужное событие

if NetEvents.lNetworkEvents and FD_ACCEPT = 0 then

begin

LogMessage(

'Внутренняя ошибка сервера - неизвестное событие');

Break;

end;

// Проверка, не было ли ошибок

if NetEvents.iErrorCode[FD_ACCEPT_BIT] <> 0 then

begin

LogMessage('Ошибка при подключении клиента: ' +

GetErrorString(NetEvents.iErrorCode[FD_ACCEPT_BIT]));

Break;

end;

ClientAddrLen := SizeOf(ClientAddr);

// Проверяем наличие подключения

ClientSocket :=

accept(FServerSocket, @ClientAddr, @ClientAddrLen);

if ClientSocket = INVALID_SOCKET then

begin

// Ошибка в функции accept возникает только тогда, когда

// происходит нечто экстраординарное. Продолжать работу

// в этом случае бессмысленно. Единственное возможное

// в нашем случае исключение - ошибка WSAEWOULDBLOCK,

// которая может возникнуть, если срабатывание события

// было ложным, и подключение от клиента отсутствует

if WSAGetLastError <> WSAEWOULDBLOCK then

begin

LogMessage('Ошибка при подключении клиента: ' +

GetErrorString);

Break;

end;

end;

// Создаем новую нить для обслуживания подключившегося клиента

// и передаем ей сокет, созданный для взаимодействия с ним.

// Указатель на нить сохраняем в списке

FClientThreads.Add(

TClientThread.Create(ClientSocket, ClientAddr));

end;

WSA_WAIT_TIMEOUT:

// Ожидание завершено по тайм-ауту

begin

// Проверяем, есть ли клиентские нити, завершившие работу.

// Если есть такие нити, удаляем их из списка

// и освобождаем объекты

for I := FClientThreads.Count -1 downto 0 do

if TClientThread(FClientThreads[I]).Finished then

begin

TClientThread(FClientThreads[I]).Free;

FClientThreads.Delete(I);

end;

// Если разрешены сообщения от сервера, отправляем

// всем клиентам сообщение с текущим временем

if FServerMsg then

for I := 0 to FClientThreads.Count - 1 do

TClientThread(FClientThreads[I]).SendString(

'Время на сервере ' + TimeToStr(Now));

end;

WSA_WAIT_FAILED:

// При ожидании возникла ошибка. Это может означать

// только какой-то серьезный сбой в библиотеке сокетов.

begin

LogMessage('Ошибка при ожидании события сервера: ' +

GetErrorString);

Break;

end;

else

// Неожиданный результат при ожидании

begin

LogMessage(

'Внутренняя ошибка сервера — неожиданный результат ожидания '

+ IntToStr(WaitRes));

Break;

end;

end;

until False;

// Останавливаем и уничтожаем все нити клиентов

for I := 0 to FClientThreads.Count - 1 do

begin

TClientThread(FClientThreads[I]).StopThread;

TClientThread(FClientThreads[I]).WaitFor;

TClientThread(FClientThreads[I]).Free;

end;

closesocket(FServerSocket);

LogMessage('Сервер завершил работу');

Synchronize(ServerForm.OnStopServer);

end;

// Завершение работы сервера. Просто взводим соответствующее

// событие, а остальное делает код в методе Execute.

procedure TListenThread.StopServer;

begin

WSASetEvent(FEvents[0));

end;

end.

Нить TListenThreadреализует сразу несколько функций. Во-первых, она обслуживает подключение клиентов и создает нити для их обслуживания. Во-вторых, уничтожает объекты завершившихся нитей. В-третьих, она с определённой периодичностью ставит в очередь на отправку всем клиентам сообщение с текущим временем сервера. И в-четвертых, управляет уничтожением клиентских нитей при завершении работы сервера.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «О чём не пишут в книгах по Delphi»

Представляем Вашему вниманию похожие книги на «О чём не пишут в книгах по Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «О чём не пишут в книгах по Delphi»

Обсуждение, отзывы о книге «О чём не пишут в книгах по Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x