[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info@builder.cz   Inzerce: reklama@grafika.cz

 Diskuzní forum: Delphi

Téma diskuze: Diskuse o vývojářském nástroji Delphi

Tip: 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.



Vaše jméno: 
Váš e-mail: 
Předmět: 

:-)  :-(  ;)  :D  :S  spatne  dobre  bold  italic  email  citace  odkaz  obrazek 
Antispam ochrana u neregistrovaných uživatelů - opište čísla z obrázku:
  

Toto fórum je provozováno také jako emailová konference s e-mailovou adresou delphi [a] builder.cz.
Podrobný návod jak se k odběru zpráv e-mailem přihlásit naleznete v tomto návodu.




  



Toto je neredigovaná a nemoderovaná diskuse čtenářů serveru Builder.cz. Redakce ani provozovatel serveru za obsah jednotlivých příspěvků nenese zodpovědnost.

info@builder.cz
Vydává Grafika Publishing, s.r.o.
Copyright (c) 1997-2005 Všechna práva vyhrazena
Pro diskuzní fóra využíváme software z phorum.org