![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
есть ссылка http://cam.pddd.perm.ru:81/?c=385
как в дельфи можно открыть её в том же например компоненте Image1 и сохранять?? Спасибо заранее за ответ. |
|
#2
|
||||
|
||||
|
Content-Type: image/jpeg у Response. так что как обычный jpg отображаешь на Image
|
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
djmix (29.09.2015)
| ||
|
#3
|
||||
|
||||
|
Код:
var
MemoryStream: TMemoryStream;
JPEGImage: TJPEGImage;
begin
MemoryStream:=TMemoryStream.Create;
JPEGImage:=TJPEGImage.Create;
try
IdHTTP1.Get('http://cam.pddd.perm.ru:81/?c=385', MemoryStream);
MemoryStream.Position:=0;
JPEGImage.LoadFromStream(MemoryStream);
Image1.Picture.Assign(JPEGImage);
finally
JPEGImage.Free;
MemoryStream.Free;
end;
end; |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
djmix (29.09.2015)
| ||
|
#4
|
|||
|
|||
|
появился ещё вопрос, открыл 16 потоков, по 16 камер хочу глядеть меняя их, и конечно это всё тормозит жуть как , как сделать типа антифриз?
могу скинуть исходный код что у меня получилось, может подскажете? |
|
#5
|
|||
|
|||
|
"Выкинуть" работу с отдельной камерой в отдельный поток, не?
|
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
djmix (01.10.2015)
| ||
|
#6
|
|||
|
|||
|
Цитата:
я могу исходник скинуть вроде так и сделал, всё равно тормозит( |
|
#7
|
|||
|
|||
|
Значит что-то не так сделал.
Ща из браузера посмотрел. Там сайт притормаживает, само отображение практически мгновенное, что и в программе должно быть. Надо твой код смотреть. Ты случаем на каждый запрос потоки не пересоздаешь ли? |
|
#8
|
|||
|
|||
|
скинул будет возможность посмотреть?
|
|
#9
|
|||
|
|||
|
Цитата:
по правильному. переходя к другой камере что необходимо сделать? не пересоздавать поток и открывать другую ссыль можно и правильно?? я и хотел чтобы посмотрел, где ошибка( |
|
#10
|
|||
|
|||
|
Ну смотри. Ты хочешь мониторить 16 камер. Т.о. тебе надо 16 потоков.
Каждый поток считывает картинку с одной камеры, отображает ее (не забываем синхронизацию), потом ждет, допустим, 1 секунду (sleep) и опять читает камеру. И так по кругу. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
djmix (04.10.2015)
| ||
|
#11
|
|||
|
|||
|
Цитата:
всё чётко, оно работает, я пытаюсь сказать следующее. я засунул следующий код по каждой камере в таймер Код:
label1.Caption:=inttostr(strint1);
MemoryStream:=TMemoryStream.Create;
JPEGImage1:=TJPEGImage.Create;
try
IdHTTP1.Get('http://cam.pddd.perm.ru:81/?c='+inttostr(strint1)+'', MemoryStream);
//label5.Caption:=IdHTTP1.Get;
MemoryStream.Position:=0;
JPEGImage1.LoadFromStream(MemoryStream);
// JPEGImage.LoadFromStream(MemoryStream);
Image1.Picture.Assign(JPEGImage1);
finally
// idHttp1.Free;
JPEGImage1.Free;
MemoryStream.Free;
end;следующий момент , сделал что все эти камеры буду меняться по нажатию кнопки Код:
strint1:=strint1+strtoint(edit1.text); strint2:=strint2+strtoint(edit2.text); strint3:=strint3+strtoint(edit3.text); strint4:=strint4+strtoint(edit4.text); strint5:=strint5+strtoint(edit5.text); strint6:=strint6+strtoint(edit6.text); strint7:=strint7+strtoint(edit7.text); strint8:=strint8+strtoint(edit8.text); strint9:=strint9+strtoint(edit9.text); strint10:=strint10+strtoint(edit10.text); strint11:=strint11+strtoint(edit11.text); strint12:=strint12+strtoint(edit12.text); strint13:=strint13+strtoint(edit13.text); strint14:=strint14+strtoint(edit14.text); strint15:=strint15+strtoint(edit15.text); strint16:=strint16+strtoint(edit16.text); ну а если ничего не делать (не листать никуда с самого начала) то я получаю изображения, всё гуд, но там камер куча и хочу поглядеть все будучи далеко от моего города. в чём подвох может быть? |
|
#12
|
|||
|
|||
|
Видимо, они начинают мешать друг другу. Не считая того, что ВСЕ запросы выполняются в одном потоке - главном потоке приложения. Предположу, что если оставить программу поработать подольше, то она тоже начнет тормозить.
Можно попробовать запустить ее под каким-нить профайлером... или поставить отладочную печать... Все-равно, есть подозрение, что по мере срабатывания таймеров очередь сообщений все растет и растет. Просто твои переключения быстрее забиавют очередь, вот и проявляется быстрее. Выноси в потоки, что бы в основном потоке была работа только с отображением. |
|
#13
|
|||
|
|||
|
Ну не знаю, что у тебя там тормозит...
Сделал такую программку (на 9 камер правда, а не на 16). Спокойно все показывает, листает. Там только некоторых камер, походу, нет или они не работают (какое-то стандартное изображение с гербом выводится). Одна только проблема - TImage мыргает при перерисовке. Надо у формы DoubleBuffered выставлять. Поток: Код:
unit CamThrd;
interface
uses
SysUtils, Classes, Graphics, ExtCtrls, IdHTTP, Jpeg;
const
CamUrl = 'http://cam.pddd.perm.ru:81/?c=%d';
type
TCamThread = class(TThread)
private
{ Private declarations }
FCamNo : Integer;
FImage : TImage;
FHTTP : TIdHTTP;
FMemStream : TMemoryStream;
FJpeg : TJpegImage;
procedure UpdateImage;
protected
procedure Execute; override;
public
constructor Create(ACamNo : Integer; AImage : TImage); virtual;
destructor Destroy; override;
procedure SetCamNo(ACamNo : Integer);
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TCamThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TCamThread }
constructor TCamThread.Create(ACamNo: Integer; AImage: TImage);
begin
FCamNo := ACamNo;
FImage := AImage;
FHTTP := TIdHTTP.Create(Nil);
FMemStream := TMemoryStream.Create;
FJpeg := TJpegImage.Create;
inherited Create(False);
end;
destructor TCamThread.Destroy;
begin
FHTTP.Free;
FMemStream.Free;
FJpeg.Free;
inherited;
end;
procedure TCamThread.Execute;
begin
While Not Terminated Do
Begin
FMemStream.Clear;
Try
FHTTP.Get(Format(CamUrl,[FCamNo]),FMemStream);
FMemStream.Seek(0,soFromBeginning);
If FMemStream.Size > 0
Then FJpeg.LoadFromStream(FMemStream);
Synchronize(UpdateImage);
Except
FJpeg.Width := 1;
FJpeg.Height := 1;
End;
If Not Terminated Then Sleep(2000);
End;
end;
procedure TCamThread.SetCamNo(ACamNo: Integer);
begin
FCamNo := ACamNo;
end;
procedure TCamThread.UpdateImage;
begin
If FImage <> Nil Then
FImage.Picture.Assign(FJpeg);
end;
end.Главная формa: Код:
unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Jpeg, ExtCtrls, CamThrd, StdCtrls;
type
TMainForm = class(TForm)
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Image5: TImage;
Image6: TImage;
Image7: TImage;
Image8: TImage;
Image9: TImage;
btPrev: TButton;
btNext: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btPrevClick(Sender: TObject);
procedure btNextClick(Sender: TObject);
private
{ Private declarations }
FThreads : Array [1..9] Of TCamThread;
FCamBias : Integer;
procedure UpdateCams;
public
{ Public declarations }
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
procedure TMainForm.FormCreate(Sender: TObject);
var
I : Integer;
AImage : TImage;
ALabel : TLabel;
begin
Self.DoubleBuffered := True;
FCamBias := 0;
For I := 1 To 9 Do
Begin
AImage := Self.FindComponent('Image' + IntToStr(I)) As TImage;
FThreads[i] := TCamThread.Create(FCamBias*9 + I,AImage);
ALabel := Self.FindComponent('Label' + IntToStr(I)) As TLabel;
ALabel.Caption := IntToStr(FCamBias*9 + I);
End;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
var
I : Integer;
begin
For I := 1 To 9 Do
Begin
FThreads[i].Terminate;
FThreads[i].WaitFor;
FThreads[i].Free;
End;
end;
procedure TMainForm.btPrevClick(Sender: TObject);
begin
If FCamBias <= 0
Then FCamBias := 0
Else FCamBias := FCamBias - 1;
UpdateCams;
end;
procedure TMainForm.UpdateCams;
var
I : Integer;
ALabel : TLabel;
begin
For I := 1 To 9 Do
Begin
FThreads[i].Suspend;
FThreads[i].SetCamNo(FCamBias*9 + I);
FThreads[i].Resume;
ALabel := Self.FindComponent('Label' + IntToStr(I)) As TLabel;
ALabel.Caption := IntToStr(FCamBias*9 + I);
End;
end;
procedure TMainForm.btNextClick(Sender: TObject);
begin
FCamBias := FCamBias + 1;
UpdateCams;
end;
end. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
djmix (06.10.2015)
| ||
|
#14
|
|||
|
|||
|
Цитата:
спасиб огромное , доберусь до дома буду проверять исправляться. |
|
#15
|
|||
|
|||
|
Будешь что?
Мне интересно - как этот процесс выглядит - "проверять исправляться"... ЗЫ. А ты не знаешь, еще для каких городов есть подобные камеры, доступные on-line? |