Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 5 413

/ вопрос открыт /

Доброва времени суток, я уже задавал этот вопрос. но ответа по существу так и не услышал.

Есть консольное приложение в котором реализованна
передача jpeg изображения через сокеты.

Суть проблемы:
Как реализовать это в простом приложении, то есть по нажатии на кнопку запустить/остановить сервер.

Сам делал множество попыток но толку от них нет.
Ниже приведу код консольного приложения.

Приложение:
  1. program RemServer;
  2. {$apptype console}
  3.  
  4. uses
  5. Windows,
  6. Forms,
  7. Messages,
  8. Graphics,
  9. SysUtils,
  10. Classes,
  11. ScktComp,
  12. Jpeg,
  13. Jpeg_IO;
  14.  
  15.  
  16. type
  17. TSCThread = class(TServerClientThread)
  18. private
  19. Bitmap:TBitmap;
  20. Jpeg:TJpegImage;
  21. protected
  22. procedure GrabScreen(Stream:TMemoryStream;const ImgSize:TPoint);
  23. procedure ClientExecute; override;
  24. public
  25. constructor Create(CreateSuspended: Boolean; ASocket: TServerClientWinSocket);
  26. destructor Destroy; override;
  27. end;
  28.  
  29.  
  30. constructor TSCThread.Create(CreateSuspended: Boolean;
  31. ASocket: TServerClientWinSocket);
  32. begin
  33. Bitmap:=TBitmap.Create;
  34. Jpeg:=TJpegImage.Create;
  35. inherited;
  36. end;
  37.  
  38. destructor TSCThread.Destroy;
  39. begin
  40. Jpeg.Free;
  41. Bitmap.Free;
  42. inherited;
  43. end;
  44.  
  45.  
  46. procedure TSCThread.GrabScreen(Stream:TMemoryStream;const ImgSize:TPoint);
  47. var
  48. Desktop:HWnd;
  49. DesktopRect: TRect;
  50. DesktopDC:HDc;
  51. begin
  52. Stream.Size:=0;
  53. Desktop:=GetDesktopWindow;
  54. GetWindowRect(Desktop,DesktopRect);
  55. Bitmap.Height:=ImgSize.Y;
  56. Bitmap.Width:=ImgSize.X;
  57. Bitmap.PixelFormat:=pf24bit;
  58. DesktopDC:=GetWindowDC(Desktop);
  59. try
  60. Win32Check(StretchBlt(Bitmap.Canvas.Handle,0,0,Bitmap.Width,Bitmap.Height,
  61. DesktopDC,DesktopRect.Left,DesktopRect.Top,DesktopRect.Right,DesktopRect.Bottom, SRCCOPY));
  62. finally
  63. ReleaseDC(Desktop,DesktopDC);
  64. end;
  65.  
  66. SaveBmpToJpegStream(Bitmap,Stream,50);
  67. end;
  68.  
  69.  
  70.  
  71.  
  72. procedure TSCThread.ClientExecute;
  73. var
  74. ScreenStream:TMemoryStream;
  75. Buf:array[0..1023] of byte;
  76. ImgSize:TPoint;
  77. size:integer;
  78. begin
  79. while (not Terminated) and ClientSocket.Connected do
  80. try
  81. ScreenStream:=TMemoryStream.Create;
  82. try
  83. if ClientSocket.ReceiveBuf(ImgSize,SizeOf(ImgSize))<>SizeOf(ImgSize) then exit;
  84.  
  85. GrabScreen(ScreenStream,ImgSize);
  86. ScreenStream.Position:=0;
  87. size:=ScreenStream.Size;
  88. ClientSocket.SendBuf(size,SizeOf(size));
  89.  
  90. while ScreenStream.Position<ScreenStream.Size do
  91. begin
  92. size:=ScreenStream.Read(Buf,SizeOf(Buf));
  93. if ClientSocket.SendBuf(Buf,size)<>size then exit;
  94. end;
  95. finally
  96. ScreenStream.Free;
  97. end;
  98. except
  99. Terminate;
  100. HandleException;
  101. end;
  102. end;
  103.  
  104.  
  105.  
  106. function Proc2Method(Code,Data:pointer):TMethod;
  107. begin
  108. result.Code:=Code;
  109. result.Data:=Data;
  110. end;
  111.  
  112.  
  113.  
  114. procedure GetThread(self,Sender: TObject; ClientSocket: TServerClientWinSocket;
  115. var SocketThread: TServerClientThread);
  116. begin
  117. SocketThread:=TSCThread.Create(true,ClientSocket);
  118. SocketThread.Priority:=tpLower;
  119. SocketThread.Resume;
  120. end;
  121.  
  122.  
  123.  
  124.  
  125.  
  126. var
  127. Server:TServerSocket;
  128.  
  129. begin
  130.  
  131.  
  132. Server:=TServerSocket.Create(nil);
  133. try
  134. Server.ServerType:=stThreadBlocking;
  135. Server.OnGetThread:=TGetThreadEvent(Proc2Method(@GetThread,Server));
  136. Server.Port:=4800;
  137. Server.Active:=true;
  138. while Server.Active do begin
  139. Sleep(100);
  140. end;
  141. finally
  142. Server.Free;
  143. end;
  144.  
  145.  
  146. end.


DimonZ Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: DimonZ (статус: Посетитель)
Вопрос отправлен: 15 июня 2011, 20:57
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 4; последнее сообщение — 16 июня 2011, 12:12; участников в обсуждении: 3.
min@y™

min@y™ (статус: Доктор наук), 15 июня 2011, 21:26 [#1]:

Цитата (DimonZ):

Сам делал множество попыток но толку от них нет.

Чо за попытки-то были?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
DimonZ

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

DimonZ (статус: Посетитель), 16 июня 2011, 12:12 [#4]:

Мережников Андрей:
90.while ScreenStream.Position<ScreenStream.Size do

если position меняется от 0 до size-1,то этот цикл никогда не закончится нормально

Самое странное что когда этот код работает в консоли то ни каких глюков нет, но как только вставляю этот код в unit
начинает глючить.

Глюки обычно такие: запускаю сервер коннектюсь клиентом,
и если фокус на форме сервера не активен то всё работает,
как только кликаю по серверной форме передача потока отпадает, хотя на клиенте значение кадров в минуту меняется,
а изображения нет.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.03 сек.