Pregunta para Super Guru o tal vez no

Iniciado por Timerlux, 7 Julio 2007, 20:30 PM

0 Miembros y 4 Visitantes están viendo este tema.

Timerlux

Hola !!!

Pues bien he hecho un sistema de captura de pantalla bastante rapido, el problema es que en la aplicacion servidor se dispara el uso de CPU al 100%,
y eso no me gusta nada, hay alguna manera de limitar el uso de CPU para una aplicacion de Visual Basic, estaria mejor que estubiera al 80% por ejemplo.

Alguien me da una respuesta? gracias


Un saludo  :rolleyes: :rolleyes: :rolleyes:


sch3m4

mejor que limitar el uso de cpu, revisa el código de tu programa, y optimízalo  ;)
SafetyBits

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.(..

BenRu

Claro que te ha salido rápido, no es para menos.  :xD
Si usas el 100% de la cpu, todas las prioridades van para la ejecucion de ese software, dejando de lado otras cosas, con posible bloqueo del pc.

Haz lo que dice Lympex.


Un saludo

Tughack

Para super guru? xD

Pues no hay nada k saber.... so hay una forma buena de hacer eso, ahora se ocupa o no mucho cpu eso ya depende de tu pc...

Hay k para cada imagen k el server envia al client, esperar (en el server) k el client responda al server dejindo k esta listo para recibir otra. Seria algo como:

- Client pide captura de pantalla
- Server recibe la orden
- Server envia la imagen y espera la respuesta del server (aki ya lo tendras k hacer tu)...
- Client recibe la imagen y la carga
- Client pide nuevamente captura de pantalla
....

Solo no uses timers...

Salu2

Hendrix

Si lo que estas aplicando tu es un bucle que capture frames peus asi es normal que consuma mucho CPU, si estas utilizando un bucle, intercala en ese bucle la instrucción DoEvents, para que no consuma tanta CPU

Un Saludo.  ;)

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián

[VolkS]

estas usando el modulo cJpg o algo asi y ese modulo a micros con menos de 500mhz anda mal

Tughack

Cita de: Hendrix. en  7 Julio 2007, 21:00 PM
Si lo que estas aplicando tu es un bucle que capture frames peus asi es normal que consuma mucho CPU, si estas utilizando un bucle, intercala en ese bucle la instrucción DoEvents, para que no consuma tanta CPU

Un Saludo.  ;)



Si eso es importante! Kualkier bucle largo k no tenga un DoEvents se lia y la aplicacion no responde.

Do
    DoEvents
    'codigo
Loop

o

For i = 0 to 5000
    DoEvents
    'codigo
Next i

Salu2

Timerlux

Bueno he de decir que: 

Acabo de terminar un sencillo proyecto para pruebas sobre esta idea y es la primera prueba que hago, supongo que se podra mejorar, hay es donde quiero que me aconsejeis.
La question es esa, se puede Optimizar sin perder velocidad o no mucha y rebajar uso CPU.

Lo he probado en Local con lo que mi PC hace las veces de Cliente y Servidor, aunque no creo que haciendo solo de servidor se reduzca el uso de CPU.

Lympex:
Citarmejor que limitar el uso de cpu, revisa el código de tu programa, y optimízalo

Esa es la question , se podra optimizar sin perder velocidad, si lo optimizo para que me mande un fotograma por segundo o dos, pues ya no tiene gracia.



Hendrix:
CitarSi lo que estas aplicando tu es un bucle que capture frames peus asi es normal que consuma mucho CPU, si estas utilizando un bucle, intercala en ese bucle la instrucción DoEvents, para que no consuma tanta CPU

Si Hendrix, era la primera prueba y no me he complicado, le he puesto un DO,DoEvents,LOOP simplemente para ver si me funcionaba, y funciono entre ""

Lo que dice Tughack me da buena espina, en un pricipio pensaba que tendria que hacerlo asi para que funcionara, pero funciono sin que el cliente confirmara la imagen recibida, me sorprendi de que funcionara sin esto, pense que se produciria un Caos y un Desfase entre cliente y servidor. tal vez haciendo esto  y quitando el DO LOOP consiga algo.

Un esquema:
----------------------
SERVER:
1 Captura de pantalla
2 GetDiBits - crea "Array de Bytes" con la informacion de la imagen
3 Comprime Array
4 Extrae Trozo y Envia,  Extrae Trozo y Envia,  Extrae Trozo y Envia ..............

CLIENT:
1 Va juntando,  Va juntando, Va juntando .................
2 Descomprime Array
3 SetDiBits - Muestra la imagen

Bueno ya os contare, y si teneis mas sugerencias !!!


:D :D  ::) :D :D



Timerlux

Otro esquemilla:

Do While Parar = False
   BitBlt Pic1.hdc, 0, 0, Screen.Width, Screen.Height, DK_DC, 0, 0, vbSrcCopy
   Pic1.Refresh
   MyGetDIBits     '-----Procedimiento que crea el Array
   DoEvents
Loop

Private Sub MyGetDIBits()
  Bla, Bla,Bla
  CompressByteArray  XArray  '-----------Aqui se llama para comprimir el Array
  EnviaByteArray XArray          '-----Procedimiento que parte y Envia
End Sub


Private Sub EnviaByteArray()
Bla,Bla, Bla     '------Se envia
End Sub


Voy a probar a meter DoEvents por todas partes por que ademas hay otro pequeño fallo en elcual cada 1 o 2 segundos aveces me llega 1 fotograma defectuoso , como si le faltara un color al televisor, se ve o rojizo o verdoso y eso es porque el Byte Array no se recompone corretamente  y le faltan algunos datos y estoy casi seguro que es porque va a toda ostia (1 fotograma cada 60 milisegundos  o 200 milisegundos en el peor de los casos "Medido en Local") y no le da tiempo a hacer todos los pasos  que tiene correctamente, si pongo DoEvents por todas partes para que termine cada paso a lo mejor lo soluciono, o si hago lo de que el cliente confirme la receppcion tambien


Saludos !!!!!






Tughack

Aver, no olvides k los estas probando localmente. Remotamente necesitas un metodo de seguridad para garantir k se recibe y esta listo para recibir nuevamente. Sino se lia todo.

Salu2