Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: grisendo on February 01, 2010, 03:51:17 PM

Title: first_instance en Windows
Post by: grisendo on February 01, 2010, 03:51:17 PM
Hola!

Ando con otro módulo para Bennu. Lo tengo ya hecho (y funciona) en Linux, pero cuando lo trato de compilar a Windows me da el siguiente fallo (obligo a --disable-auto-import):

undefined reference to _first_instance

Si no pongo --disable-auto-import, automáticamente se me pone a --enable-auto-import al primer fallo y me da warning, pero compila. Eso sí, first_instance es NULL y el módulo no funciona.

Sólo linko a libbgdrtm.dll, donde se supone que está (en Linux está en libbgdrtm.so), pero no va.

¿Alguien sabe cómo solucionarlo? :)
Title: Re: first_instance en Windows
Post by: SplinterGU on February 01, 2010, 06:58:55 PM

wait... en que momento te da NULL? cuando la queres leer? hasta que los procesos no arrancan eso valdra NULL... digo esto, por si queres comprobar el valor en el init...

la lib es la correcta
Title: Re: first_instance en Windows
Post by: grisendo on February 01, 2010, 07:49:38 PM
La función la llamo dentro de un proceso, la cosa rara es que funciona en linux, pero no en windows...

inicio
    proceso1

proceso1
    id1=proceso2
    id2=proceso3
    loop
        if(key(_f))
            JODIDA_FUNCION_QUE_DA_NULL_FIRST_INSTANCE_EN_WINDOWS_PERO_NO_EN_LINUX()
        end
        frame;
    end
...

Creo que los tiros van por _first_instance, que no me lo encuentra en libbgdrtm.dll (sacada de la última RC) y si le digo que lo ignore, el linker asume que está en el DLL pero que se llamará _imp_first_instance (dándome NULL en tiempo de ejecución). Es la única solución razonable que veo, pero no sé si es lo que ocurre de verdad ni sé cómo solucionarlo.
Title: Re: first_instance en Windows
Post by: SplinterGU on February 01, 2010, 09:02:09 PM
estas incluyendo los include de bennu?
Title: Re: first_instance en Windows
Post by: grisendo on February 01, 2010, 10:44:03 PM
Incluyo estos:

#include "bgddl.h"
#include "offsets.h"

El código completo está aquí: http://www.grisendo.com/proyectos/mod_freezer/mod_freezer.c
aunque casi me dé vergüenza enseñarlo porque he usado un vector gigante en lugar de estructuras
de datos más sofisticadas xDD

Implementa un congelador por niveles, y en Linux funciona. Al "congelar" un proceso le envía
la señal s_freeze la primera vez (las siguientes no). Cada vez que se "congela" más, no se envía
la señal s_freeze, pero se cuenta las veces que ha sido congelado. La función de "descongelar"
elimina una capa de congelación: si ya no quedan capas de congelación vuelve al proceso a su
estado original (no tiene por qué ser despierto, puede ser dormido). También tiene funciones
para ver el nivel de congelación de un proceso, y para congelar/descongelar un nivel todos los
procesos menos el que llama a la función (ideal para pausas).

Es que lo vi por el foro, Windgate comentó que conocía a uno que lo intentó implementar (sí,
ese soy yo xDD) pero lo intenté hace tiempo como módulo PRG y era un truño...
Title: Re: first_instance en Windows
Post by: SplinterGU on February 02, 2010, 01:47:35 AM
caramba, no me digas que no publique la funcion para hacer pausas todavia... shit!
Title: Re: first_instance en Windows
Post by: Windgate on February 02, 2010, 06:57:28 AM
La idea de Grisendo fue buena (Data de hace 2 años si no me equivoco :D), los niveles de congelación eran especialmente útiles para poder trabajar con menús y submenús en los que interesa que los anteriores tengan varios niveles de congelación.

Grisendo es el que más ha trabajado el problema, en su día yo lo pensé hacer mediante puras FUNCTION para que bloqueen al menú anterior, pero fue sólo una idea que no llevé a cabo...

¿A qué pausa te refieres tú Splinter? No será el otro post que he leido sobre enviar señales a todos los procesos a la vez... :P
Title: Re: first_instance en Windows
Post by: DCelso on February 02, 2010, 07:32:23 AM
se refiere a lo mismo pero hecho internamente.
Title: Re: first_instance en Windows
Post by: grisendo on February 02, 2010, 09:26:58 AM
Entonces eso ya está hecho? Eso me pasa por no leerme los CHANGE.txt de cada versión jaja. Pues nada, si está hecho ahí se queda el tema, y si no, me decís que lo intento arreglar para que rule en Windows también.

Yo probé a hacerlo con FUNCTION y PROCESS, pero no lo conseguí al principio, igual era porque la versión era muy vieja... tan vieja que empecé a hacerlo con fénix... En las versiones que usé había incongruencias tan gordas como que MIN_INTEGER era mayor que MAX_INTEGER!! Y tenía que generar vectores muchismo gordos y peludos. Al final algo conseguí, pero al intentar mejorarlo un poco (usar tablas hash) me petaba todo y ahí abandoné la idea... y eso que el único cambio que jodía el asunto era la función hash, que era la mayor tontería del mundo!!! HASH(N)=N... así que por eso he intentado hacerlo internamente.

Title: Re: first_instance en Windows
Post by: SplinterGU on February 02, 2010, 03:05:18 PM
me refiero a esto... si si...

http://forum.bennugd.org/index.php?topic=1149.msg17259#msg17259

con esto se puede enviar una señal para congelar uno/todos/type/tree de procesos o enviar una señal para dormirlos a todos... y luego recuperar el estado anterior cuando querramos... solo se puede guardar 1 estado, y hasta que no restauremos podemos enviar las señales que querramos con el metodo normal (excepto kill) y luego recuperar el estado que guardamos previamente.

no es interno, son 2 funciones escrita en lenguaje BennuGD