Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Getparent?

Iniciado por Ipis, 22 de Octubre de 2003, 06:40:46 PM

« anterior - próximo »

Zaelsius

 Bueno intentaremos echarte un cable  :rolleyes: . Voy a poner código de ejemplo, tomado de un sniffer de teclado que hice hace tiempo(disponible con código fuente en ZsGames.tk).

Resulta que mi sniffer tenía una opción para enviar los ficheros de log a un servidor ftp, pero claro, mientras se envia el fichero y tal, quiero seguir registrando las pulsaciones de teclas, así que hay que usar un hilo.

Lo primero es utilizar el MFC Class Wizard(o los ventanucos de clases en el VS.net) para añadir una nueva clase derivada de WinThread al proyecto. En mi caso la llamé CFTPThread. FtpThread.h era algo así:


...

class CFTPThread : public CWinThread
{
DECLARE_DYNCREATE(CFTPThread)
protected:
CFTPThread();           // protected constructor used by dynamic creation

// Attributes
public:
bool m_bConnectionAttempted; // This vars are not really used in
int m_nFileStatus;    // this program, but report useful
        // inf. about the connection status.

// Operations
public:

static UINT PutFile(LPVOID lpFileName);

// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CFTPThread)
public:
virtual BOOL InitInstance();
virtual int ExitInstance();
//}}AFX_VIRTUAL

// Implementation
protected:
virtual ~CFTPThread();

// Generated message map functions
//{{AFX_MSG(CFTPThread)
 // NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG

DECLARE_MESSAGE_MAP()
};

...


Menos PutFile() y los dos datos miembros el resto del código es auto-generado. Pues bien, saltándome las normas del buen diseño OO y todo eso, decidí que lo más práctico era tener una función estática de clase PutFile() para subir los ficheros, ya que nunca iba a subir más de un fichero a la vez ni ná.

Para crear un nuevo hilo hacia algo así en otra parte de mi aplicación:


m_nFileStatus = 0;
AfxBeginThread((AFX_THREADPROC) CFTPThread::PutFile,&m_nFileStatus);



Eso lanza la función PutFile() en un hilo de ejecución paralelo, mientras sigo ejecutando el bucle principal de mi aplicación. En mi caso, para la comunicación entre los dos hilos me bastaba tener acceso a m_nFileStatus en los dos, mediante un puntero.

AVISO: En el src del sniffer no hago ninguna comprobación de acceso sobre m_nFileStatus, ni accedo a él mediante secciones críticas ni ná de ná. Eso está  MAL, pq los dos hilos podrían querer acceder a la variable a la vez(posibilidad remota en sistemas monoprocesador). Aun así, como sólo leeré la var. en un hilo y escribiré en la var. en otro hilo, pues no habrá comportamiento indeseado de la app en caso de conflicto. Este anuncio es de un medicamento.

Cuando la función PutFile() acaba, el hilo asociado se destruye automáticamente. En caso de querer abortar el hilo desde el programa principal, pues llamas a AfxFinishThread(o una función de nombre similar.. no recuerdo) y lo apuñalas por la espalda.

Volviendo al problema concreto de Ipis y resumiendo:

- Crea una clase derivada de WinThread.
- Añádele una función miembro static. (Ej: CMyThread::LaunchApp())
- Añádele algunas variables miembro static, para controlar, p.ej. que no se pueda lanzar un programa si se está lanzando otro aun.

Se puede hacer mejor y más bonito, pero esta solución creo que no es muy complicada. Y creo que el hilo lo deberías lanzar dede CMainFrame::OnMatlab().
Intenta hacer tu clase thread lo más genérica posible para que te sirva para lanzar distintas aplicaciones, etc.


;) Ale a ver si hay suerte ahora y lo consigues. Y si he dichoo alguna burrada corregidme XD.

Ipis

 Gracias por la explicación,ZaelSius!!!! Tu ayuda ha servido de mucho :rolleyes: Me ha quedado más claro...tanto que creo que,después de todo,un hilo no es la solución a mi problema:
Citar... static, para controlar, p.ej. que no se pueda lanzar un programa si se está lanzando otro aun
Precisamente eso es lo que busco...mi programa principal sirve de soporte a otros 3 programas(Matlab,Envi y Bilko)y además permite abrir imagenes y realizar sencillas operaciones de procesado.Pero esas operaciones NUNCA se harán mientras esté algún programa en ejecución.Además,si el usuario quiere,debe poder trabajar con los 3 programas a la vez(es decir,tener abiertos los 3 programas)

Con estas especificaciones,creo que queda descartada la opción del hilo,me equivoco?(espero que no)

Lo que me gustaría hacer es conseguir que,igual que cuando abres una imagen la dibujas sobre la vista de una hija,si la maximizas ocupa todo el área cliente y si la minimizas se queda dentro de ésta, los programas se abran en una ventan MDI hija,dentro del marco principal de la aplicación(como si fueran otro documento más) y que al maximizar o minimizarlos se ajusten a las dimensiones del área cliente(y no que ocupen toda la pantalla o se vayan a la barra de inicio en cada caso)

No sé si me he explicado bien(la idea la tengo,pero me cuesta expresarla  ;) ) Puede hacerse???tampoco lo tengo muy claro...

Gracias de nuevo :P





 

Zaelsius

 Bueno.. si no utilizas hilos, cuando lances un programa tu aplicación se congelará hasta que comience el programa(matlab o el q sea), a partir de ahí los 2 se ejecutan correctamente sin necesidad de hacer nada.

Lo del hilo únicamente es para evitar ese "cuelgue" momentáneo.

Teniendo en cuenta que no se debería poder utilizar las utilidades de tu aplicacion mientras corres matlab, sería incluso mejor hacer un spawnl() con _P_WAIT(lanza un proceso y no retorna hasta que ese proceso acaba). Sin embargo si quieres poder lanzar más de un programa a la vez esa opción queda descartada.


Ipis

 Perdón,pero creo que no me he explicado bien:
CitarPero esas operaciones NUNCA se harán mientras esté algún programa en ejecución.
Lo que quise decir es que mientras esté uno o más programas en ejecución no tiene sentido usar las utilidades de mi aplicación(NO ESTA PROHIBIDO)porque primero se usarán los programas y luego se comprobará el resultado con la aplicación.

Que mi aplicación se congele mientras se abre algún programa no me preocupa porque el tiempo es mínimo(ni lo notas) y es esencial que se pueda usar más de un programa a la vez,así que.....descartando los hilos estamos en el principio.....

¿Cómo puedo meter el programa dentro de mi aplicación???Porque eso me sigue sin funcionar......(mira que soy pesá,eh?  ;) )

Gracias y un saludo!!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.