|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
![]() |
||||||||||
|
|
|||||||||
Diskuzní forum: DelphiTéma diskuze: Diskuse o vývojářském nástroji DelphiTip: nemáte rádi v textu smajlíky? Ruší vaše zdrojové kody? Vypněte si je! (Moje nastavení / Nastavení soukromí) Chyba ve vlákně...
Vloženo uživatelem: warezman - uživatel již zaslal 411 příspěvků (IP uloženo)
Datum: 01. 02. 2010 20:21
Zdrávím mám vlákno, které odesílá pomocí synapse obrázek přes TCP/IP, vyletí mi to na Img.SaveToStream, ale ne vzdy na poprve, ale behem par sekund urcite...
Hlasi to nedostatek systemovych zdroju. Img je TJPEGImage.. Nevite nekdo cim by to mohlo byt...? procedure TTCPThread.Execute;
var
StreamHeader: TStreamDataHeader;
StreamScreenHeader: TStreamScreenDataHeader;
begin
while not Terminated do begin
cs.Enter;
try
if ImgChanged then
begin
ms:= TMemoryStream.Create;
try
Img.SaveToStream(ms);
Form1.memLog.Lines.Add(Format('Sending %d bytes of screen...',[ms.Size]));
StreamHeader.HeaderType:= htScreen;
StreamHeader.HeaderSize:= SizeOf(TStreamScreenDataHeader);
StreamScreenHeader.DataSize:= ms.Size;
Sock.SendBuffer(@StreamHeader, SizeOf(TStreamDataHeader));
if Sock.LastError <> 0 then Exit;
Sock.SendBuffer(@StreamScreenHeader, SizeOf(TStreamScreenDataHeader));
if Sock.LastError <> 0 then Exit;
ms.Position:= 0;
Sock.SendStreamRAW(ms);
if Sock.LastError <> 0 then Exit;
ImgChanged:= False;
finally
ms.Free;
end;
end
finally
cs.Leave;
end;
Sleep(1);
end;
end;Re: Chyba ve vlákně...
Vloženo uživatelem: Drizbach - uživatel již zaslal 229 příspěvků (IP uloženo)
Datum: 01. 02. 2010 22:04
Vypada to na race condition v pri pouzivani Img. Co delas ve zbytku kodu s tim Img? --
Make it idiot proof and someone will make a better idiot.
Re: Chyba ve vlákně...
Vloženo uživatelem: warezman - uživatel již zaslal 411 příspěvků (IP uloženo)
Datum: 01. 02. 2010 23:51
no jeste tam jede vlakno, ktery porad dokola uklada screen..
procedure TCaptureScreen.Execute;
var
hScreenDC: HDC;
hDekstopHWND: HWND;
bmp: TBitmap;
begin
hDekstopHWND:= GetDesktopWindow;
hScreenDC:= GetDC(hDekstopHWND);
try
while not Terminated do begin
bmp:= TBitmap.Create;
try
bmp.Width:= Screen.Width;
bmp.Height:= Screen.Height;
bmp.PixelFormat:= pf8bit;
BitBlt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, hScreenDC, 0, 0, SRCCOPY);
if Assigned(Img) then
begin
cs.Enter;
try
Img.Assign(bmp);
ImgChanged:= True;
finally
cs.Leave;
end;
end;
finally
bmp.Free;
end;
Sleep(1);
end;
finally
ReleaseDC(hDekstopHWND, hScreenDC);
end;
end;Re: Chyba ve vlákně...
Vloženo uživatelem: Semi - uživatel již zaslal 2510 příspěvků (IP uloženo)
Datum: 02. 02. 2010 19:32
Timhle to asi nebude:
Muze byt problem v tom, ze Img.Assign(Bmp) se pripoji ke stejnemu objektu TBitmapImage (ktery je obsazen i v TBitmap) a nasledne pri bmp.Free tam dojde k nejake kolizi? Na zkousku zkuste cs.Enter/cs.Leave presunout i kolem uvolnovani te bitmapy, jestli to bude delat taky... (pokud ne, tak to muzete zase vratit, takhle by to bylo elegantnejsi, ze TCP-thread nemusi cekat na BitBlt...), nebo zkusit ukladat Img do TMemoryStream hned pri porizeni a v TCP-threadu uz pracovat jenom s tim streamem... (samozrejme se nesmi potkat se screen-threadem, ktery by ten stream zrovna vyprazdnoval, kdyz je odesilan) Zkuste ten program sledovat v TaskMgr, kde si zapnete sloupce "Objekty User" a "Objekty GDI", jestli nektery z nich monotonne nestoupa? (Pak by to znamenalo, ze nekde neco neuvolnujete, ale v kodu, ktery jste sem poslal, vsechno vypada velmi ciste uvolnovane...) Akorat tedy - doporucil bych GetDC/ReleaseDC vsunout dovnitr "while not Terminated" a vzdy si ho vytahovat/uvolnovat znovu...! Ted to jeste vidim - kdyz se to zastavi pod radkem SaveToStream, tak chyba spis bude ve Form1.memLog.Lines.Add - do TMemoLines nelze pristupovat z threadu! Slo by pouzit Synchronize, nebo SendMessage na handle formulare s necim, nebo SendMessage primo na handle Memo (pouzil byste zpravy EM_SETSEL a EM_REPLACESEL?) Zkuste tam dat nejakou neskodnou radku mezi SaveToStream a memLog.Lines.Add, abyste rozlisil, v ktere funkci to hlasi tu chybu... i:=0; if (i<>0) then ; Takovouhle konstrukci optimalizator nevynecha... Kdyby tam bylo jenom treba inc(i); a promenna se jiz nikde nepouzila, tak ji optimalizator vynecha uplne... Re: Chyba ve vlákně...
Vloženo uživatelem: warezman - uživatel již zaslal 411 příspěvků (IP uloženo)
Datum: 03. 02. 2010 20:47
NO tak sem to vyzkousel a nic... dokonce sem to prepsal i tak, ze obraz ukladam do streamu primo v threadu co snima obraz, ale s tim se taky presuna ta chyba OUt Of System resource....
tuto chybu se mi povedlo odstranit, kdyz snimani obrazovky a ukladani do streamu vyhodim prycz z threadu.... Re: Chyba ve vlákně...
Vloženo uživatelem: Drizbach - uživatel již zaslal 229 příspěvků (IP uloženo)
Datum: 04. 02. 2010 09:09
Jeste me napada jestli by nemohl byt problem taky v tom logovani:
Form1.memLog.Lines.Add(Format('Sending %d bytes of screen...',[ms.Size])); Zkus ten radek zakomentovat. --
Make it idiot proof and someone will make a better idiot.
Toto fórum je provozováno také jako emailová konference s e-mailovou adresou delphi [a] builder.cz. Toto je neredigovaná a nemoderovaná diskuse čtenářů serveru Builder.cz. Redakce ani provozovatel serveru za obsah jednotlivých příspěvků nenese zodpovědnost. |