|
Вопрос # 5 413/ вопрос открыт / |
|
Доброва времени суток, я уже задавал этот вопрос. но ответа по существу так и не услышал.
Есть консольное приложение в котором реализованна
передача jpeg изображения через сокеты.
Суть проблемы:
Как реализовать это в простом приложении, то есть по нажатии на кнопку запустить/остановить сервер.
Сам делал множество попыток но толку от них нет.
Ниже приведу код консольного приложения.
Приложение: Переключить в обычный режим- program RemServer;
- {$apptype console}
-
- uses
- Windows,
- Forms,
- Messages,
- Graphics,
- SysUtils,
- Classes,
- ScktComp,
- Jpeg,
- Jpeg_IO;
-
-
- type
- TSCThread = class(TServerClientThread)
- private
- Bitmap:TBitmap;
- Jpeg:TJpegImage;
- protected
- procedure GrabScreen(Stream:TMemoryStream;const ImgSize:TPoint);
- procedure ClientExecute; override;
- public
- constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
- destructor Destroy; override;
- end;
-
-
- constructor TSCThread.Create(CreateSuspended: Boolean;
- ASocket: TServerClientWinSocket);
- begin
- Bitmap:=TBitmap.Create;
- Jpeg:=TJpegImage.Create;
- inherited;
- end;
-
- destructor TSCThread.Destroy;
- begin
- Jpeg.Free;
- Bitmap.Free;
- inherited;
- end;
-
-
- procedure TSCThread.GrabScreen(Stream:TMemoryStream;const ImgSize:TPoint);
- var
- Desktop:HWnd;
- DesktopRect: TRect;
- DesktopDC:HDc;
- begin
- Stream.Size:=0;
- Desktop:=GetDesktopWindow;
- GetWindowRect(Desktop,DesktopRect);
- Bitmap.Height:=ImgSize.Y;
- Bitmap.Width:=ImgSize.X;
- Bitmap.PixelFormat:=pf24bit;
- DesktopDC:=GetWindowDC(Desktop);
- try
- Win32Check(StretchBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
- DesktopDC,DesktopRect.Left,DesktopRect.Top,DesktopRect.Right,DesktopRect.Bottom,
SRCCOPY));
- finally
- ReleaseDC(Desktop,DesktopDC);
- end;
-
- SaveBmpToJpegStream(Bitmap,Stream,50);
- end;
-
-
-
-
- procedure TSCThread.ClientExecute;
- var
- ScreenStream:TMemoryStream;
- Buf:array[0..1023] of byte;
- ImgSize:TPoint;
- size:integer;
- begin
- while (not Terminated) and ClientSocket.Connected do
- try
- ScreenStream:=TMemoryStream.Create;
- try
- if ClientSocket.ReceiveBuf(ImgSize,SizeOf(ImgSize))<>SizeOf(ImgSize) then exit;
-
- GrabScreen(ScreenStream,ImgSize);
- ScreenStream.Position:=0;
- size:=ScreenStream.Size;
- ClientSocket.SendBuf(size,SizeOf(size));
-
- while ScreenStream.Position<ScreenStream.Size do
- begin
- size:=ScreenStream.Read(Buf,SizeOf(Buf));
- if ClientSocket.SendBuf(Buf,size)<>size then exit;
- end;
- finally
- ScreenStream.Free;
- end;
- except
- Terminate;
- HandleException;
- end;
- end;
-
-
-
- function Proc2Method(Code,Data:pointer):TMethod;
- begin
- result.Code:=Code;
- result.Data:=Data;
- end;
-
-
-
- procedure GetThread(self,Sender: TObject; ClientSocket: TServerClientWinSocket;
- var SocketThread: TServerClientThread);
- begin
- SocketThread:=TSCThread.Create(true,ClientSocket);
- SocketThread.Priority:=tpLower;
- SocketThread.Resume;
- end;
-
-
-
-
-
- var
- Server:TServerSocket;
-
- begin
-
-
- Server:=TServerSocket.Create(nil);
- try
- Server.ServerType:=stThreadBlocking;
- Server.OnGetThread:=TGetThreadEvent(Proc2Method(@GetThread,Server));
- Server.Port:=4800;
- Server.Active:=true;
- while Server.Active do begin
- Sleep(100);
- end;
- finally
- Server.Free;
- end;
-
-
- end.
 |
Вопрос задал: DimonZ (статус: Посетитель)
Вопрос отправлен: 15 июня 2011, 20:57
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 4; последнее сообщение — 16 июня 2011, 12:12; участников в обсуждении: 3.
|
min@y™ (статус: Доктор наук), 15 июня 2011, 21:26 [#1]:
Цитата (DimonZ):
Сам делал множество попыток но толку от них нет.
Чо за попытки-то были?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
DimonZ (статус: Посетитель), 15 июня 2011, 22:32 [#2]:
К примеру поместить всё это дело в Thread, но это работает не долго либо прекращает передачу jpeg потока, либо выдаёт
ошибку "Out of memory".
|
|
Мережников Андрей (статус: Абитуриент), 16 июня 2011, 05:51 [#3]:
Цитата (DimonZ):
90.while ScreenStream.Position<ScreenStream.Size do
если position меняется от 0 до size-1,то этот цикл никогда не закончится нормально
|
|
DimonZ (статус: Посетитель), 16 июня 2011, 12:12 [#4]:
Мережников Андрей:
90.while ScreenStream.Position<ScreenStream.Size do
если position меняется от 0 до size-1,то этот цикл никогда не закончится нормально
Самое странное что когда этот код работает в консоли то ни каких глюков нет, но как только вставляю этот код в unit
начинает глючить.
Глюки обычно такие: запускаю сервер коннектюсь клиентом,
и если фокус на форме сервера не активен то всё работает,
как только кликаю по серверной форме передача потока отпадает, хотя на клиенте значение кадров в минуту меняется,
а изображения нет.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|