![]() |
|
|
Регистрация | << Правила форума >> | 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? |