how can i fix this code, not sure if can i use message loops inside threads
program pClient;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
Classes,
SimpleTcp;
var
Stream: TMemoryStream;
procedure ReadFile(nSize: Dword; Socket: TTcpSocket);
var
Buffer: array[0..4096] of Char;
Read, CurrRead, BuffSize: Dword;
begin
BuffSize := SizeOf(Buffer);
Stream.Clear;
Stream.SetSize(nSize);
Read := 0;
while (Read < nSize) and (Socket.Active) do
begin
if (nSize - Read) >= BuffSize then
CurrRead := BuffSize
else
CurrRead := (nSize - Read);
Socket.Read(Buffer, CurrRead);
Stream.Write(Buffer, CurrRead);
Read := Read + CurrRead;
end;
Stream.Position := 0;
end;
procedure ProcessData(Socket: TTcpSocket);
var
Data: string;
FileSize: Dword;
begin
while Socket.Active do
begin
Socket.ReadLn(Data);
if Length(Data) > 0 then
begin
if Pos('HELLO', Data) > 0 then
begin
WriteLn('1 PROC');
Delete(Data, 1, Pos('|', Data));
FileSize := StrToInt(Data);
Stream := TMemoryStream.Create;
ReadFile(FileSize, Socket);
Stream.SaveToFile('REC.PNG');
Stream.Free;
WriteLn('2 PROC');
end;
end;
Sleep(5);
end;
end;
procedure Client(Thread: TThreadProc);
var
TcpClient: TTcpClient;
begin
TcpClient := TTcpClient.Create('localhost', 1500);
if TcpClient.Active then
begin
TcpClient.WriteLn('HELLO');
ProcessData(TcpClient);
end;
end;
var
Msg: TMsg;
begin
StartThread(@Client);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.
program pServer;
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils,
Classes,
SimpleTcp;
var
Stream: TMemoryStream;
procedure SendFile(Socket: TTcpSocket);
var
Buffer: array[0..4096] of Char;
Read, CurrRead, BuffSize: Dword;
begin
BuffSize := SizeOf(Buffer);
Read := 0;
while (Read < Stream.Size) and Socket.Active do
begin
if (Stream.Size - Read) >= BuffSize then
CurrRead := BuffSize
else
CurrRead := (Stream.Size - Read);
Stream.Read(Buffer, CurrRead);
Socket.Write(Buffer, CurrRead);
Read := Read + CurrRead;
end;
end;
procedure ProcessData(Socket: TTcpSocket);
var
Data: string;
begin
while Socket.Active do
begin
Socket.ReadLn(Data);
if Length(Data) > 0 then
begin
if Pos('HELLO', Data) > 0 then
begin
WriteLn('1 PROC');
Stream := TMemoryStream.Create;
Stream.LoadFromFile('IMG.PNG');
Socket.WriteLn('HELLO|' + IntToStr(Stream.Size));
SendFile(Socket);
Stream.Free;
WriteLn('2 PROC');
end;
end;
Sleep(5);
end;
end;
procedure Server(Thread: TThreadProc);
var
TcpServer: TTcpServer;
TcpSocket: TTcpSocket;
begin
TcpServer := TTcpServer.Create(1500);
TcpSocket := TcpServer.Accept;
if TcpSocket.Active then
begin
ProcessData(TcpSocket);
end;
end;
var
Msg: TMsg;
begin
StartThread(@Server);
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end.