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.
 

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.

Preguntas similares