Читаем О чём не пишут в книгах по Delphi полностью

 В этом модуле реализуется дополнительная нить UDP-чата, отвечающая за прием сообщений.

}

interface

uses

 SysUtils, Classes, WinSock;

type

 TReceiveThread = class(TThread)

 private

// Сообщение, которое нужно добавить в лог,

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

// Synchronize, не может иметь параметров.

FMessage: string;

// Сокет, получающий сообщения

FSocket: TSocket;

// Вспомогательный метод для вызова через Synchronize

 procedure DoLogMessage;

 protected

procedure Execute; override;

 // Вывод сообщения в лог главной формы

 procedure LogMessage(const Msg: string);

 public

constructor Create(ServerSocket: TSocket);

 end;

implementation

uses ChatMainUnit;

{TReceiveThread}

// Сокет, получающий сообщения, создается в главной нити,

// а сюда передаётся через параметр конструктора

constructor TReceiveThread.Create(ServerSocket: TSocket);

begin

 FSocket:= ServerSocket;

 inherited Create(False);

end;

procedure TReceiveThread.Execute;

var

 // Буфер для получения сообщения.

 // Размер равен максимальному размеру UDP-дейтаграммы

 Buffer: array[0..65506] of Byte;

 // Адрес, с которого пришло сообщение

 RecvAddr: TSockAddr;

 RecvLen, AddrLen: Integer;

 Msg: string;

begin

 // Начинаем бесконечный цикл, на каждой итерации которого

 // читается одна дейтаграмма

 repeat

AddrLen:= SizeOf(RecvAddr);

 // Получаем дейтаграмму

 RecvLen:=

 recvfrom(FSocket, Buffer, SizeOf(Buffer), 0, RecvAddr, AddrLen);

 // Так как UDP не поддерживает соединение, ошибку при вызове recvfrom

// мы можем получить, только если случилось что-то совсем

// экстраординарное. В этом случае завершаем работу нити.

if RecvLen < 0 then

begin

LogMessage('Ошибка при получении сообщения: ' + GetErrorString);

// Перевод элементов управления главной формы

 // в состояние "Сервер не работает"

Synchronizе(ChatForm.OnStopServer);

Break;

end;

// Устанавливаем нужный размер строки

 SetLength(Msg, RecvLen);

 // и копируем в нее дейтаграмму из буфера

 if RecvLen > 0 then Move(Buffer, Msg[1], RecvLen);

 LogMessage('Сообщение с адреса ' + inet_ntoa(RecvAddr.sin_addr) + ':' +

 IntToStr(ntohs(RecvAddr.sin_port)) + ':' + Msg);

 until False;

 closesocket(FSocket);

end;

procedure TReceiveThread.LogMessage(const Msg: string);

begin

 FMessage:= Msg;

 Synchronize(DoLogMessage);

end;

procedure TReceiveThread.DoLogMessage;

begin

 ChatForm.AddMessageToLog(FMessage);

end;

end.

Перейти на страницу:

Похожие книги

1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных