 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Lun 17 Dic, 2007 1:35 pm Asunto: No ralentizar con SendBuf! |
|
|
Hola gente...
Estoy tratando de enviar imagenes al cliente pero al enviarlo con:
| Código: |
FileSocket->Socket->Connections[0]->SendBuf(MyStream->Memory,MyStream->Size);
|
el computador comienza a quedar ralentizarse.
ENtonces coloque el metodo en un BeginThread. ahora no ralentiza tanto pero cuando abro el form me da un error OutofSYstemResource!
Que sera?? _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Lun 17 Dic, 2007 9:16 pm Asunto: |
|
|
Ya me rendi con la funcio BeginThread, ahora estaba tratando de hacer una clase Thread, pero la verdad es que he tenido problemas tambien porque nunca habia creado una.
Lo que quiero hacer es colocar esta linea:
| Código: |
FileSocket->Socket->Connections[0]->SendBuf(MyStream->Memory,MyStream->Size);
|
Dentro de un Thread para que complete de enviar el archivo sin que quede lento el computador.
Si alguien tiene una mejor solucion digame!
Salu2 _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
Tor Master


Registrado: 22 Mar 2005Mensajes: 269Ubicación: obera, misiones, argentina
|
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Mar 18 Dic, 2007 12:53 pm Asunto: |
|
|
Hola Tor!!
Te cuento que yo ya habia probado esos ejemplos y nada que le he encontrado solucion,
es que los ejemplos que encontré aqui, son con while y yo no preciso eso, solo es donde colocar la line del SendBuf hasta que complete el envio,
He probado ya varias tipos de Thread cosas y me sigue trabando no se pq, de seguro estoy haciendo algo errado!
Salu2! y espero una solucion! _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Jue 20 Dic, 2007 2:50 pm Asunto: |
|
|
Ninguna solucaion todavia???
Se que no puede ser muy dificil y en realidad necesito un buen Thread!
alguien a hecho algo parecido? _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 25 Dic, 2007 5:04 am Asunto: |
|
|
Hoy es navidad, y me he dado una vuelta, jejej me puedes indicar que componentes usas, pues yo he usado los IdTCPClient para envíar las imágenes aun que tambien lo uso para recibir, y no he tenido muchos problemas.
vamos a lo mejor lo que he tenido es que en nuevas versiones de los Componentes Indy, quitan y ponen nuevas propiedades, pero he visto que son demasiado efectivos, yo lo uso en un proyecto que me sirve para "tomar" fotos de un servidor a distancia y poder verificar la actividad del mismo, trayendo a mi equipo las imagenes.
por si gustas enviame la información que tengas en este foro y a vuelta de Navidad, que seria el 26 a las 1:00 am estoy de nuevo contestando.
FELIZ NAVIDAD!!! _________________
 |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Mie 26 Dic, 2007 11:21 am Asunto: |
|
|
jajaa.. .Gracias Cesar!!
estoy usando los componentes ClientSocket y ServerSocket.
No se si haz probado enviar datos "grandes" (Imagenes) por estos componentes, el computador se traba un poco, entonces pense en hacer un Hilo, pero no se si me puedas dar una mejor solucion, ya que lo estaba haciendo con BeginThread y no me estaba dando los resultados que esperaba.
Gracias de antemano! _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Jue 27 Dic, 2007 3:40 am Asunto: |
|
|
Intenta usar los componentes de la paleta Indy, por mas sencillas al manejar, pues uno de los problemas que tuve al enviar archivos grandes (el limite para los ClientSocket y ServerSocket son de 64 Mb) algo asi como de 64 megas, para arriba, es que sencillamente se pierden teniendo que crear "otros" hilos indpendientes y enviar la información Segmentada del archivo, eso no es problema pues le indicas la posicion y tamaño desde donde va a comenzar la transferir, pero puede ser algo engorroso, si no estas familiarizado con los Socketes por ello es mucho mas sencillo enviar un archivo por los Indy, que por cierto vienen corrigiendo un fallo de la clase TWinSocket que vienen en la información del Archivo Windows.h este mismo error era el de los tamaños de archivo y algunos otros, pues hasta use los componentes ICS para envio y recepcion de archivos y pues no obtuve el resultado esperado según corrigen algunos de los fallos, pero para lo de archivos grandes uso por facilidad y entendimiento los componentes de la palenta INDY
TCPCliente y TCPSever, que entre muchas de las cosas, son muy similares a los que mencionas. _________________
 |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Jue 27 Dic, 2007 12:59 pm Asunto: |
|
|
La cuestion es que no son Imagenes tan grandes, de hecho solo es una Captura de Pantalla que estoy haciendo el problema es que el Server al enviarme la Imagen de la forma:
| Código: |
FileSocket->Socket->Connections[0]->SendBuf(MyStream->Memory,MyStream->Size);
|
el computador traba un poco, y eso depende del tamanho de Buffer que le coloco al Cliente, es decir en el RecieveBuf(Buff,sizeof(Buff)); Depende del tamanho que le coloco al Buffer que será mas notorio el Delay en el Server.
Entonces yo queria colocar un tamanho grande (char Buff[8192]) para que las capturas sean mas rapidas y efectivamente lo son, pero el delay es mucho mas notorio en el Server que por ejemplo (char Buff[1024]), que es menos notorio pero con capturas mucho mas lentas! Espero haberme explicado.
Yo he estado trabajando con los TSockets por unos anhos asi que tengo mucha mas experiencia en ellos que en los TIndy, por eso fue que no comenze el proyecto con esos componenetes. Yo se que tu trabajaste por un tiempo con esos componentes tambien por los mensajes tuyos que he leido todo este tiempo, asi que si me puedes echar una mano en esta te lo agradeceria de verdad, porque nada que encuentro la solucion!
Saludos y espero tu pronta respuesta! _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 05 Ene, 2008 7:01 am Asunto: |
|
|
Hola despues de tanto tiempo estoy contestando esta parte, bien al que hay que hacer, dependiendo como captures la pantalla, recuerda que estas "grabando" en memoria un BMP, el proceso de que se convierta o no en JPG, eso no tiene nada que ver pues la captura ya esta echa y esta se ha almacenado en BMP en la parte de la memoria, yo realice una rutina para capturar pantallas ayudandome de un codigo de aqui del foro y esta es la que yo hice.
| Código: |
//------------------------------------------------------------------------------
// COPIAR LA PANTALLA DE LA COPUTADORA
TJPEGImage* __fastcall ScreenJPG(int x ,int y ,int Width ,int Height)
{
TJPEGImage *jpg = new TJPEGImage();
Graphics::TBitmap *bm=new Graphics::TBitmap();
bm->Width=Screen->Width;
bm->Height=Screen->Height;
HWND desktop=GetDesktopWindow();
HDC desktophdc=GetDC(desktop);
BitBlt(bm->Canvas->Handle,x,y,Screen->Width,Screen->Height,desktophdc,0,0,SRCCOPY);
jpg->Assign(bm);
ReleaseDC(desktop,desktophdc);
delete bm;
return(jpg);
}
//---------------------------------------------------------------------------
void __fastcall TccsgServidor::IdServerExecute(TIdContext *AContext)
{
this->PageControl1->ActivePage = tbStatus;
this->ProcesarPeticiones(AContext);
}
//---------------------------------------------------------------------------
void __fastcall TccsgServidor::ProcesarPeticiones(TIdContext *AContext)
{
TIdIOHandler *IOH = dynamic_cast<TIdIOHandler*>(AContext->Connection->IOHandler);
IOH->LargeStream = true;
AnsiString s = IOH->ReadLn();
AnsiString sCommand;
AnsiString sAction;
s = UpperCase(s);
sCommand = s.SubString (1,3).UpperCase();
sAction = s.SubString(5,s.Length()-4);
try
{
if (sCommand == "SCR")
{
TJPEGImage *jpg = new TJPEGImage();
TMemoryStream *msFile= new TMemoryStream();
jpg->Assign(ScreenJPG(0,0,Screen->Width,Screen->Height));
jpg->SaveToStream(msFile);
msFile->Position = 0;
IOH->WriteBufferClear();
Application->ProcessMessages();
IOH->Write(msFile,msFile->Size,false);
IOH->Close();
delete msFile;
delete jpg;
}
}
catch (...)
{
}
} |
Estoy usando los componentes INDY de la version 10 que vienen con el Builder 2007 (de prueba) y como puedes ver el cliente envia un mensaje llamado SCR, puede que la captura que tu realices, sea diferente, pero esto hace que use las API's de Windows que en teoria son mas rapidas pues se comunican directamente con el entorno de windows, aunado a esto, tambien debo decirte que el codigo del cliente para pedir la pantalla es la siguiente.
| Código: | void __fastcall TForm1::Button3Click(TObject *Sender)
{
this->IdTCPCliente->Host = this->Edit3->Text.Trim();
if (this->IdTCPCliente->Connected())
this->IdTCPCliente->Disconnect();
Application->ProcessMessages();
TMemoryStream *msFile = new TMemoryStream();
String Cadena = "SCR";
this->IdTCPCliente->Connect();
TIdIOHandler *IOH = dynamic_cast<TIdIOHandler*>(this->IdTCPCliente->IOHandler);
IOH->WriteLn(Cadena);
try
{
while(IOH->Connected())
{
IOH->ReadStream(msFile,this->CGauge1->MaxValue,true);
Application->ProcessMessages();
}
}
__finally
{
msFile->Position = 0;
TJPEGImage *jpg = new TJPEGImage();
jpg->LoadFromStream(msFile);
this->Image1->Picture->Bitmap->Assign(jpg);
delete msFile;
IOH->Close();
}
}
//--------------------------------------------------------------------------- |
De esta manera y quitando los componentes que no son parte del proceso (Cague... etc etc), traigo del servidor la pantalla de datos y puedo visualizarla, si tu codigo es diferente o difiere de este sería bueno que me indicaras, pero a lo que va tu pregunta, al momento de tomar la "foto" del escritorio del servidor es normal pues hasta cuando presionas la tecla [Print Screen] de tu maquina esta deja de funcionar por el lapso de 1 segundo dependiendo de la resolución de tu pantalla.
Es decir entre mas grande sea la resolucion de pantalla mas tarda la rutina en tomar la "foto", dejame investigar alguna manera mucho mas rapida de tomar la imagen y establecerla pues al enviar un flujo de datos, recuerda que estas enviando los bytes de la foto por la red y si la foto en cuestion de tamaño sobrepasa 1 mega de datos, pues esto es lo que estas enviando por la red, y no una imagen de 512 bytes o menos.
Saludos y Feliz Año 2008 _________________
 |
|
| Volver arriba |
|
 |
Cri_sys Master


Registrado: 13 Feb 2004Mensajes: 198Ubicación: Maringá, Brazil
|
Publicado: Sab 05 Ene, 2008 9:28 pm Asunto: |
|
|
Hola cesar gracias por tu respuesta!
Los procesos que uso para la captura de patanlla son muy similares, difiere en que no estoy usando Indy si no TSockets como ya habia comentado.
Las imagenes no son muy grandes ya que el print screen lo visualizo en una tela mas pequenha y le bajo la calidad a la imagen!
Como te iba diciendo continue trabajando con TSockets, de hecho cuando comenze el proyecto pregunte aqui cual seria mejor si Indy o Tsockets, y no me respondieron pero obte por usar TSockets ya que tengo experiencia en este.
Precisamente ayer estaba haciendo las ultimas pruebas del programa (ya acabado) y resulta que parece ser un problema de compilacion de C++ Builder. El problema es el siguiente:
Estoy usando Borland Development que tienen en la empresa, pero al compilar y quitar los build y el RTL, me daba un error de Winspool.dll, entonces me baje uno de internet y me corria todo bien pero con el delay que te comentaba. despues vi que en la misma carpeta de system32 estaba el winspool solo que con extension drv la cambie a dll y ya no tiene delay las actualizaciones me estan dando casi en tiempoi real sin que la otra persona lo note que era mi preocupacion, ya que el mouse se trababa mucho.
Entonces parece que es un problema de compilado de Borland, entonces el Lunes voy a instalar una version que yo tengo y a compilar para ver si todo funciona correctamente y te aviso!
Gracias por todo!
Despues voy a tener q hacer otras aplicaciones cliente servidor y creo q me pasare a INDY ya que parecen ser mas poderosos, asi que ese ejemplo me sirve de mucho.
Saludos y te comento luego para que no te ocurra! _________________ Read what I mean, not what I write! |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|