Liberar el CPU a OTROS procesos de igual gerarquía (no puedo usar el DoEvents)

05/05/2012 - 00:00 por flyguille | Informe spam
La cuestión es la siguiente, tengo 2 procesos en VB, ambos tienen
establecidos una HIGH process priority.

Uno de los procesos es ActiveX Server, y otro una aplicación que es
cliente de ese ActiveX.

El problema es que el ActiveX Server, en teoría tiene tanto que hacer
a veces que bloquea la ejecución del otro proceso que es de igual
prioridad. He llegado a medir bloqueos de hasta 10 segundos (cosa
inexplicable).

Obviamente esto pasa en CPUs single-core, porque en dual-core o más
cores, cada core se encarga de uno de estos procesos y no hay dramas.

Ahora, si yo usara el simple DoEvents en el proceso ActiveX Server, el
DoEvents simplemente provocaría la ejecución recursiva de tantas otras
tareas a realizar antes de liberar la CPU hacia otros procesos de
igual prioridad.

Lo que yo estoy buscando es insertar por ahí un medidor de tiempo
transcurrido, que ya lo tengo, y cuando transcurra + de 1/4 de segundo
o lago así (tendré q hacer pruebas de rendimiento), liberar el cpu
hacia otro proceso, sin atender todos los eventos locales que haya que
atender.

Ya que el proceso que hace de cliente, es más importante que lo que
hace el proceso que hace de ActiveX Server.

¿hay alguna función de Win que fuerce al task-switching a q ejecute el
otro proceso u otros procesos (por ej, sin especificar cuales) ?

Lamentablemente esto me está parando el soporte full a singlecores y
es todo un tema.

Es más, mi olfato me dice a veces, q el ActiveX marshalling tiene
lagunas de cuelgues por 10 segundos? porque ... una cosa es que se
coma 1 o 2 segundos, pero he detectado cuelgues de 10 segundos,
inexplicables

Y sospecho mucho del activex-marshalling porque cuando hay que crear
una instancia del objeto activex, a veces falla hasta 32 veces
consecutivas, tira error.

por ejemplo en un código simple como:

(AIR CODE)

Dim obj as Prog1Activex, trys as integer

tryagain:
on error goto ErrCreate
set obj = new Prog1Activex.SubObjectX

exit sub



ErrCreate:
resume ErrCreate2
ErrCreate2:

doevents
trys=trys+1
if trys2 then exit sub
goto tryagain
-

If I get that simple routine sometimes escape indicating error in
creating the ActiveX instance, I am hardly suspecting about there is
something wrong with activeX handling in VB5, but I can't find what
the hell.

Preguntas similare

Leer las respuestas

#1 flyguille
05/05/2012 - 00:12 | Informe spam
On 4 mayo, 19:00, flyguille wrote:
La cuestión es la siguiente, tengo 2 procesos en VB, ambos tienen
establecidos una HIGH process priority.

Uno de los procesos es ActiveX Server, y otro una aplicación que es
cliente de ese ActiveX.

El problema es que el ActiveX Server, en teoría tiene tanto que hacer
a veces que bloquea la ejecución del otro proceso que es de igual
prioridad. He llegado a medir bloqueos de hasta 10 segundos (cosa
inexplicable).

Obviamente esto pasa en CPUs single-core, porque en dual-core o más
cores, cada core se encarga de uno de estos procesos y no hay dramas.

Ahora, si yo usara el simple DoEvents en el proceso ActiveX Server, el
DoEvents simplemente provocaría la ejecución recursiva de tantas otras
tareas a realizar antes de liberar la CPU hacia otros procesos de
igual prioridad.

Lo que yo estoy buscando es insertar por ahí un medidor de tiempo
transcurrido, que ya lo tengo, y cuando transcurra + de 1/4 de segundo
o lago así (tendré q hacer pruebas de rendimiento), liberar el cpu
hacia otro proceso, sin atender todos los eventos locales que haya que
atender.

Ya que el proceso que hace de cliente, es más importante que lo que
hace el proceso que hace de ActiveX Server.

¿hay alguna función de Win que fuerce al task-switching a q ejecute el
otro proceso u otros procesos (por ej, sin especificar cuales) ?

Lamentablemente esto me está parando el soporte full a singlecores y
es todo un tema.

Es más, mi olfato me dice a veces, q el ActiveX marshalling tiene
lagunas de cuelgues por 10 segundos? porque ... una cosa es que se
coma 1 o 2 segundos, pero he detectado cuelgues de 10 segundos,
inexplicables

Y sospecho mucho del activex-marshalling porque cuando hay que crear
una instancia del objeto activex, a veces falla hasta 32 veces
consecutivas, tira error.

por ejemplo en un código simple como:

(AIR CODE)

Dim obj as Prog1Activex, trys as integer

tryagain:
on error goto ErrCreate
set obj = new Prog1Activex.SubObjectX

exit sub

ErrCreate:
resume ErrCreate2
ErrCreate2:

doevents
trys=trys+1
if trys2 then exit sub
goto tryagain
-

If I get that simple routine sometimes escape indicating error in
creating the ActiveX instance, I am hardly suspecting about there is
something wrong with activeX handling in VB5, but I can't find what
the hell.



Cabe destacar que ya intenté todo tipo de trucos como darles
prioridades de procesos asimétricas.

Por ejemplo, si le doy más prioridad al proceso cliente, el server se
torna muy dificil de crear la instancia (aunque tendría que testear
más esta hipótesis pero yo recuerdo q no funcionaba).

Si le doy más prioridad al activeX server, claro, el problema se
acentúa.
Respuesta Responder a este mensaje
#2 flyguille
05/05/2012 - 17:38 | Informe spam
On 4 mayo, 19:12, flyguille wrote:
On 4 mayo, 19:00, flyguille wrote:









> La cuestión es la siguiente, tengo 2 procesos en VB, ambos tienen
> establecidos una HIGH process priority.

> Uno de los procesos es ActiveX Server, y otro una aplicación que es
> cliente de ese ActiveX.

> El problema es que el ActiveX Server, en teoría tiene tanto que hacer
> a veces que bloquea la ejecución del otro proceso que es de igual
> prioridad. He llegado a medir bloqueos de hasta 10 segundos (cosa
> inexplicable).

> Obviamente esto pasa en CPUs single-core, porque en dual-core o más
> cores, cada core se encarga de uno de estos procesos y no hay dramas.

> Ahora, si yo usara el simple DoEvents en el proceso ActiveX Server, el
> DoEvents simplemente provocaría la ejecución recursiva de tantas otras
> tareas a realizar antes de liberar la CPU hacia otros procesos de
> igual prioridad.

> Lo que yo estoy buscando es insertar por ahí un medidor de tiempo
> transcurrido, que ya lo tengo, y cuando transcurra + de 1/4 de segundo
> o lago así (tendré q hacer pruebas de rendimiento), liberar el cpu
> hacia otro proceso, sin atender todos los eventos locales que haya que
> atender.

> Ya que el proceso que hace de cliente, es más importante que lo que
> hace el proceso que hace de ActiveX Server.

> ¿hay alguna función de Win que fuerce al task-switching a q ejecute el
> otro proceso u otros procesos (por ej, sin especificar cuales) ?

> Lamentablemente esto me está parando el soporte full a singlecores y
> es todo un tema.

> Es más, mi olfato me dice a veces, q el ActiveX marshalling tiene
> lagunas de cuelgues por 10 segundos? porque ... una cosa es que se
> coma 1 o 2 segundos, pero he detectado cuelgues de 10 segundos,
> inexplicables

> Y sospecho mucho del activex-marshalling porque cuando hay que crear
> una instancia del objeto activex, a veces falla hasta 32 veces
> consecutivas, tira error.

> por ejemplo en un código simple como:

> (AIR CODE)

> Dim obj as Prog1Activex, trys as integer

> tryagain:
> on error goto ErrCreate
> set obj = new Prog1Activex.SubObjectX

> exit sub

> ErrCreate:
> resume ErrCreate2
> ErrCreate2:

> doevents
> trys=trys+1
> if trys2 then exit sub
> goto tryagain
> -

> If I get that simple routine sometimes escape indicating error in
> creating the ActiveX instance, I am hardly suspecting about there is
> something wrong with activeX handling in VB5, but I can't find what
> the hell.

Cabe destacar que ya intenté todo tipo de trucos como darles
prioridades de procesos asimétricas.

Por ejemplo, si le doy más prioridad al proceso cliente, el server se
torna muy dificil de crear la instancia (aunque tendría que testear
más esta hipótesis pero yo recuerdo q no funcionaba).

Si le doy más prioridad al activeX server, claro, el problema se
acentúa.



Hice lo de darle menos prioridad de proceso al proceso server, pero no
es lo ideal, ahora cuando se bloquea por 10 segundos, no molesta a los
otros procesos q son más importantes, pero esos 10 segundos q se
congela sin hacer aparentemente nada son inexplicables.

lo único que se tarde 10 segundos en cerrar un winsock para conexiones
LAN, es lo único q usa el WinSock.
Respuesta Responder a este mensaje
#3 Leonardo Azpurua
05/05/2012 - 20:35 | Informe spam
"flyguille" escribió en el mensaje
news:
La cuestión es la siguiente, tengo 2 procesos en VB, ambos tienen
establecidos una HIGH process priority.

Uno de los procesos es ActiveX Server, y otro una aplicación que es
cliente de ese ActiveX.

El problema es que el ActiveX Server, en teoría tiene tanto que hacer
a veces que bloquea la ejecución del otro proceso que es de igual
prioridad. He llegado a medir bloqueos de hasta 10 segundos (cosa
inexplicable).

Obviamente esto pasa en CPUs single-core, porque en dual-core o más
cores, cada core se encarga de uno de estos procesos y no hay dramas.

Ahora, si yo usara el simple DoEvents en el proceso ActiveX Server, el
DoEvents simplemente provocaría la ejecución recursiva de tantas otras
tareas a realizar antes de liberar la CPU hacia otros procesos de
igual prioridad.
-

Hola,

Prueba a llamar a Sleep.

DoEvents conserva activo el proceso en VB6.

Sleep desactiva por completo el proceso en ejecución y devuelve el control
al SO.

Suerte!
Respuesta Responder a este mensaje
#4 flyguille
06/05/2012 - 00:02 | Informe spam
On 5 mayo, 15:35, "Leonardo Azpurua" wrote:
"flyguille" escribió en el mensajenews:
La cuestión es la siguiente, tengo 2 procesos en VB, ambos tienen
establecidos una HIGH process priority.

Uno de los procesos es ActiveX Server, y otro una aplicación que es
cliente de ese ActiveX.

El problema es que el ActiveX Server, en teoría tiene tanto que hacer
a veces que bloquea la ejecución del otro proceso que es de igual
prioridad. He llegado a medir bloqueos de hasta 10 segundos (cosa
inexplicable).

Obviamente esto pasa en CPUs single-core, porque en dual-core o más
cores, cada core se encarga de uno de estos procesos y no hay dramas.

Ahora, si yo usara el simple DoEvents en el proceso ActiveX Server, el
DoEvents simplemente provocaría la ejecución recursiva de tantas otras
tareas a realizar antes de liberar la CPU hacia otros procesos de
igual prioridad.
-

Hola,

Prueba a llamar a Sleep.

DoEvents conserva activo el proceso en VB6.

Sleep desactiva por completo el proceso en ejecución y devuelve el control
al SO.

Suerte!



ah buenisimo, voy a buscar info acerca de eso.
Respuesta Responder a este mensaje
#5 Leonardo Azpurua
06/05/2012 - 14:15 | Informe spam
"flyguille" escribió en el mensaje
news:

DoEvents conserva activo el proceso en VB6.

Sleep desactiva por completo el proceso en ejecución y devuelve el
control
al SO.

Suerte!



ah buenisimo, voy a buscar info acerca de eso.




Por favor, avisa si te sirve.

El prototipo (copiado de la ApiGuide) es este:

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

¡Suerte!
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida