|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - diego.martinez
Páginas: 1 ... 9 10 [11] 12
251
« en: Domingo 24 de Diciembre de 2006, 22:33 »
Buenas: Es una pregunata mas o menos generica espero. He creado una aplicacion que lee un archivo de texto y lo pasa por un parser que interpreta la informacion desechando ciertas lineas. Cuando tiene una linea valida lo inserta en una base de datos access ODBC. He descubierto que en ciertos ordenadores la aplicacion tarda 3 minutos en digerir un archivo. Y en otro ordenador con identico hardware, la misma aplicacion, tarda 1 HORA!. La pregunta es: existe alguna dll por adjuntar o algun paso intermedio que he ignorado que hace que se prepare el software para ir mas rapido o algo asi? La aplicacion la prepare para que se linkara con todos los contenidos staticos. os muestro lo que hago , aunque realmente es muy basico. Pero quizas he dado por alto alguna cosa. En mi ordenador y algunos otros va excelente, pero en otros va lentisimo. #define WINVER 0x0501 CDatabase Db; CString sFile = "access.mdb"; int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { CString sDsn; CString Sql; CString sDriver = "MICROSOFT ACCESS DRIVER (*.MDB)"; sDsn.Format("ODBC;DRIVER=Microsoft Access Driver (*.mdb);DSN='';DBQ=%s",sFile); [...] //________________________ APERTURA DE DATABASE try { Db.Open(NULL,false,false,sDsn); } catch(CDBException* dbError) {[...]} catch(...) {[...]} try { Sql="DELETE * FROM Artek"; Db.ExecuteSQL(Sql); } catch(...) {[...]} [...] //##################################################################################### BUCLE PRINCIPAL CString Insert; MSG Msg; int NumInserts=0; do { if (PeekMessage(&Msg,NULL,0,0,PM_REMOVE)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } Sleep(3); //--------------- Leemos Linea memset(Line,'\0',500); n=Log->ReadLine(Line,500); if (n<=0) { Parse_Finished=true;break; } //---------------- Interpretar linea n=0; try{ n=sscanf(Line,"%s %s [%c] : %x\r\n",Date,Time,&Byte,&Hex); }catch(...){ continue; } //--------------- Insertar Linea si es valida if (n!=4) {[...]} else { Hex=Hex&0x000000FF; if (Hex<0xFE) { if (Hex>=0x80) { Hex-=0x80; Id_Obra=(int)Hex; try{ if (Id_Obra<Registro.Obras.size() && Id_Obra>=0) sprintf(Obra_Nombre,"%s",Registro.Obras[Id_Obra].nombre); } catch(...) {[...]} if (Registro.Obras[Id_Obra].Tipo!=-1) //si no esta desactivada if (!(strcmp(Obra_Nombre,LastObra_Nombre)==0 && strcmp(Date,LastDate)==0 && strcmp(Time,LastTime)==0)) { try{ strcpy(LastObra_Nombre,Obra_Nombre); //----- si es la misma que la ultima incluso en el segundo strcpy(LastDate,Date); //------ Ignorar strcpy(LastTime,Time); } catch(...) {[...]} try { //! aqui esta la insercion Sql.Format("INSERT INTO Artek Id_Alarma,Id_Obra,Nombre_Obra,Fecha,Hora) VALUES (%d,%d,'%s','%s','%s')",ID++,Id_Obra,Obra_Nombre,Date,Time); Db.ExecuteSQL(Sql); //---- la metemos en el Access Sql=""; } catch(CDBException * dbError) {[...] } catch(...) {[...] } } } } } }while(Parse_Finished==0); //##################################################################################### //_____________________________________________________________________________________________ Cerrar ACCESS Log->Close(); Db.Close(); [... limpieza de otras cosas ...] }
Espero que no sea mucha molestia de codigo, he eliminado todo lo no relacionado con la base de datos. Es solo saber si hay algun paso para preparar la database o alguna cosa que hago mal que hace ese comportamiento. Muchas gracias por anticipado por vuestro tiempo.
253
« en: Jueves 30 de Noviembre de 2006, 18:08 »
Buenas:
Estoy intentando hacer un gestor de errores del codigo, y me preguntaba, (no se si estoy preguntando una burrada):
hay alguna forma de accesar el contenido de la pila de llamadas (call stack), tal que al llamar a una funcion me indique por que funciones ha pasado?
un ejemplo de lo que querria seria:
void func1() { func2(); }
void func2() { func3(); } void func3() { escribe_pila(); }
y el resultado :
xxxx:xxxx func3 xxxx:xxxx func2 xxxx:xxxx func1
ya se que seguramente tendria que hacer una tabla con pseudonimos para las direcciones de las funciones y comparar las direcciones de la pila con la tabla para identificarlas, pero ¿es posible acceder a la pila?. Inmagino que acceder a ella tendra el problema intrinseco de afectar a la propia pila en la llamada...
pd: gracias por adelantado como siempre
254
« en: Miércoles 15 de Noviembre de 2006, 09:44 »
si el rectangulo es un frame, coge su HDC y pintas el bitmap con BitBlt
Para las coordenadas hay una funcion para convertir de coordenadas de pantalla a coordenadas de una ventana.
255
« en: Jueves 19 de Octubre de 2006, 23:37 »
no se si lo entendi bien pero si es solo dibujar las diagonales, al ser un tablero cuadrado solo tienes que rastrear las columnas y marcar el pto de arriba y de abajo... [achtung , code spoiler] seleccionar para ver.
char matrix[20][20];
memset(matrix,' ',20*20*sizeof(char)); //ponemos toda la matrix a ' ' blancos
for (int x=0;x<20;x++) { matrix matrix }
[/spoiler]
256
« en: Viernes 6 de Octubre de 2006, 02:05 »
tambien se puede hacer en windows usando el CreateFile Handle Handle_del_File; char * name; Handle_del_File=CreateFile(name,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,0,OPEN_ALWAYS,0,NULL); te devuelve un manipulador de fichero que luego usas para leerlo. la ventaja es que abriendolo asi te permite abrirlo con otro programa a la vez, aunque , la verdad es que nunca lo he hecho Para leerlo usas ReadFile (HANDLE file_handle, char * buffer, unsigned int NBytesALeer, & unsigned int NBytesLeidosConExito, (LPOVERLAPPED) NULL); y para escribir mas de lo mismo WriteFile(file , string , strlen(string), &n ,(LPOVERLAPPED)NULL); Aun asi se puede usar el fopen de toda la vida , solo lo pongo como alternativa adicional.
257
« en: Miércoles 4 de Octubre de 2006, 16:26 »
buenas de nuevo. muchas gracias por las respuestas. Ya lo encontré y a sido de lo mas curioso , (ademas de una verguenza de error) resulta que no hacia bien el: SetCommState(com,&dcb) //no configuraba bien el dcb por que lo pisaba en una linea superios :S en el que se asignan los baudios,stopbit etc... y no se llegaba a configurar. En el momento que se lanzaba con normalidad ya se habian configurado por otra aplicacion como el hiperterminal. Pero al reiniciar el sistema tiene sin configurar el puerto y no lee a 9600 sino en vete a saber, por eso en mi pc funcionaba pero en otros no. El fallo esta localizado y corregido, gracias por la ayuda. PD: aun asi no habia comprobado lo del ACCESS_DENIED asi que ahora es mas robusto . PDD: Por si a alguien pasa por aqui con algun error parecido, asi es el codigo tras la corrección: GetCommState(com,&dcb); //recibimos la config dcb.BaudRate = 9600; //baudios dcb.ByteSize = 8; //tamaño byte dcb.Parity = NOPARITY; //paridad dcb.StopBits = ONESTOPBIT; //bit de parada dcb.fAbortOnError = TRUE; SetupComm(com,128,128); //ponemos el tamaño de buffer SetCommState(com,&dcb) tout.ReadIntervalTimeout =32; tout.ReadTotalTimeoutConstant =512; tout.ReadTotalTimeoutMultiplier =12; SetCommTimeouts(com,&tout);
258
« en: Miércoles 4 de Octubre de 2006, 12:40 »
buenas de nuevo. No se produce el ERROR_ACCESS_DENIED, pero he descubierto cuando se produce, se produce cuando se reinicia el sistema. La aplicacion esta situada en el Menu de Inicio para lanzarse automaticamente cuando se reinicia. En ese momento, sin razon aparente, deja de leer correctamente y solo lee 7F o 7B independientemente del caracter a enviar. El fallo se genera por iniciar la aplicacion en el startup. como puedo evitarlo? que puede ser el causante? tenia que tomar alguna precaucion especial al abrir el puerto? muchas gracias por la ayuda, pero estoy perdido con esto
259
« en: Martes 3 de Octubre de 2006, 21:46 »
Umm la verdad es que solo comprobaba el Invalid_handle, voy a echarle un ojo. Uso //.////COM%d por que en puertos por encima del 10 me da fallo si no pongo las barritas, lo lei por msdn o por ahi. gracias , ya os comentare. lo mas complicado es que aqui no consigo emular el error
260
« en: Martes 3 de Octubre de 2006, 16:48 »
Buenas: Ultimamente me ha aparacido un fallo muy curioso, tengo una aplicacion en visual c++ para windows xp que lee del puerto rs232 o usb con conversor usando el CreateFile("//.////COM1",...); siempre me ha funcionado bien sin ningun problema, sin embargo, en un par de ordenadores en concreto (de la misma organización) siempre que leen , leen 7F (127, caracter DEL) independientemente del byte que se transmita. Antes de leer, (que leo con ReadFile) me aseguro de asignar buffer de lectura, configuracion de Bits, parada y etc , y de establecer los timeouts. Todos ellos parece que pasan sin problemas, puesto que si no mostrarian mensaje de error. Esto ocurre tanto con cable como con adaptador usb , asi pues tengo la sospecha de que quizas sea un problema de la configuracion de permisos del ordenador, es esto posible?? Si el administrador impide la lectura de puerto serie, recibe siempre 7f?
261
« en: Martes 26 de Septiembre de 2006, 17:23 »
añadele un Sleep(x) de 20, 50 o 100 milisegundos , el programa requerira menos cpu y respondera mejor a la parada. Y si, mejor en un hilo.
262
« en: Lunes 25 de Septiembre de 2006, 01:21 »
puedes usar UpdateWindow
tambien puedes mandar el mensaje WM_PAINT a la ventana usando SendMessage
aun asi seguramente no te redibuje nada si antes no le indicas a windows que toda la ventana debe ser redibujada , para ello debes invalidar el contenido de la ventana empleando
InvalidateRect( HWND handle_ventana,RECT rectangulo_ventana, true);
para cojer el rectangulo de toda la ventana usa GetWindowRect (HWND, RECT *);
No me acuerdo de los parametros pero creo que es asi.
Suerte.
263
« en: Viernes 15 de Septiembre de 2006, 17:47 »
Buenas:
En estos momentos estoy intentando programar una aplicación que envie un archivo de texto simple , algo como "alarma! alarma!" a un movil empleando una conexion via bluetooth con un adaptador.
Supuestamente para esto lo mas adecuado seria enviar un OBEX.
Tengo ya un programa que busca los dispositivos bluetooth. Pero no se como hacer para establecer la conexión y enviar la trama.
Estoy usando Windows Sockets 2 y Visual Studio 2003 con el sdk de sp2.
Alguien sabe de algun tutorial o cacho de codigo sencillito?
264
« en: Martes 29 de Agosto de 2006, 16:47 »
ummm
es el unico hilo que accede a la base de datos?
si no lo es podria haber algun conflicto de acceso (varios hilos intentan acceder a la vez), podrias usar Mutex, si es eso me dices y te paso un ejemplo de como usar los mutex
le pasas el Path por parametro al thread o es global?
que tipo de excepción es?
Cual es la Orden que usas para salvar?
Se crea la tabla?
db.Execute(Orden); db.Execute(Orden); con esto creas 2 tablas que se llaman igual?
espero poder ayudar
265
« en: Domingo 27 de Agosto de 2006, 05:03 »
Muchas gracias, has dado en el clavo otra vez.
El wndproc se ponia en null, pasandole el DefWindowProc se ha arreglado , asi pues ya tengo por donde ir para arreglarlo.
Al hacerse el CreateWindowEx el mensaje de NC_CREATE que se manda caia en un puntero nulo del procedimiento y plaf, Access Violation.
He estado leyendo en internet que pasar punteros de WNDPROC entre methods es delicado (por eso fuera de la clase el codigo funcionaba) ya informare cuando lo resuelva.
Muchas gracias de nuevo, un saludo.
266
« en: Sábado 26 de Agosto de 2006, 19:25 »
vaya, pues es un fallo raro: el codigo, colocado en el main funciona correctamente, en una funcion tambien , pero falla si lo coloco en un metodo de una clase. el Fallo es : Unhandled Exception in w.exe: 0xC0000005 Access Violation y me manda a un punto sin codigo ensamblador con las tipicas "???" en la direccion 0 o sea que me manda a NULL , lo malo es que ese codigo funciona fuera del metodo y siempre que miro en Internet esta hecho igual.  me esta volviendo loco, acaso no se pueden crear ventanas en un metodo? no le encuentro el sentido. ya siento la molestia, pero estoy desconcertado, por ahora lo metere en el main pero pretendia encapsularlo.
267
« en: Sábado 26 de Agosto de 2006, 18:17 »
Disculpa no haber respondido antes, el fallo era mio el wc era WNDCLASS y lo estaba usando como WNDCLASSEX
gracias igualmente
268
« en: Miércoles 23 de Agosto de 2006, 15:24 »
He probado a cambiar todo el codigo por otro codigo verificado y sigue fallando.
269
« en: Miércoles 23 de Agosto de 2006, 15:18 »
Buenas:
Pues eso, no entiendo que hago mal en este segmento de codigo. La verdad es que esta cortapegado de otra aplicacion en la que si funciona, asi que mas que cual es el fallo en el codigo , la pregunta seria ¿que puede provocar que CreateWindowEx provoque excepcion asi?
El debug me da "Damage After Normal Block", supongo que es un puntero desviado?
appWINDOW::appWINDOW() { HINSTANCE hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window
//Step 1: Registering the Window Class wc.cbSize = sizeof(WNDCLASSEX); //siempre es sizeof(wndclassex); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.hCursor = NULL; wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "Prueba"; wc.hIconSm = NULL;
RegisterClassEx(&wc);
hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, "Prueba", //es el lpszClassName de la ClassEx registrada para que sepa como es el master "Prueba de dialogos", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 600, 600, NULL, NULL, hInstance, NULL); <------------------- Excepcion aqui ... }
gracias de antemano.
270
« en: Martes 22 de Agosto de 2006, 09:30 »
Es cierto, mi main es cpp y init es c. Tienes razon , muchas gracias por la ayuda.
271
« en: Lunes 21 de Agosto de 2006, 15:02 »
Buenas: tengo un main en el que tengo #include <init.h> void main (void) { Init(); }
y init.h es: void Init(); void InitAlarm(); void AlarmFunc(void *);
e init.c es: #include <init.h> #include <windows.h> #include <appConfig.h> #include <global.h> #include <definitions.h> #include <resource.h> #include <wndproc.h> #include <process.h> void Init(void) { AppConfig(); hfuente = CreateFont(...); //fuente //----------------------- Common Controls InitCommonControls(); //---------------------------------- Abrimos el archivo de entrada de datos if (app.DataIncome==DATA_INCOME_FILE) InitFileIncome(); InitAlarm(); }
bien: el problema es que me da al compilar: main.obj : error LNK2001: unresolved external symbol "void __cdecl Init(void)" (?Init@@YAXXZ) Debug/MARCH.exe : fatal error LNK1120: 1 unresolved externals y no entiendo a que se debe, en el main llamo a <init.h> en init.h prototipizo la funcion Init() y en el init.c la defino. Alguien puede explicarme a que puede deberse?  gracias por anticipado.
272
« en: Viernes 23 de Junio de 2006, 18:00 »
gracias por la respuesta. A ver, si yo uso un ValidateRect pasandole como argumento toda la ventana, el resultado es que no se deberia de alterar el contenido? El caso es que usar el Validate me ha resuelto el problema de que al pasar la ventana se destrozara el dibujo, peeero, solo se restablece el dibujo al quitar la ventana de encima, si muevo la ventana superior, el dibujo se destripa. La ventana que pasa por encima es un OpenChooseFileDialog, al cerrarse, todo queda bien, pero al moverla, destroza el dibujado. Esta parte es la que me desconcierta, tal como decis, y tal como creia yo, si al moverse la ventana sobre la mia, se manda el WM_PAINT, deberia de redibujarse inmediatamente y no deberia de verse el estropicio.
273
« en: Viernes 23 de Junio de 2006, 16:31 »
muchas gracias por vuestras respuestas, voy a probarlo.
274
« en: Martes 13 de Junio de 2006, 16:40 »
Gracias por la respuesta, el fallo fue mio que no me explique bien.
La cosa es que tengo unas ventanas dibujadas a manita enteras usando GDI en el WM_PAINT.
Y dibujan y redibujan perfectamente cuando salen del monitor, se mueven ... etc.
El problema es que cuando paso una ventana por encima, me genera lineas grises (de no dibujado) sobre la ventana de debajo.
La idea era detectar si una ventana iba a pasar por encima para invalidar el contenido y mandar el mensaje de WM_PAINT.
Yo creo que realmente, al pasar por encima, se manda el WM_PAINT pero el hecho de que no se dibuje bien... no lo entiendo...
gracias.
275
« en: Lunes 12 de Junio de 2006, 18:16 »
Se genera alguna notificacion WIN32 cuando una ventana pasa por encima de otra? gracias
Páginas: 1 ... 9 10 [11] 12
|
|
|