| 
| 
 | Вопрос # 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;     varServer: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
 начинает глючить.
 
 Глюки обычно такие: запускаю сервер коннектюсь клиентом,
 и если фокус на форме сервера не активен то всё работает,
 как только кликаю по серверной форме передача потока отпадает, хотя на клиенте значение кадров в минуту меняется,
 а изображения нет.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |