|
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 - kati
Páginas: [1]
1
« en: Jueves 21 de Junio de 2007, 16:32 »
buenas!! te dejo un ejemplo dónde se utiliza un array de labels....luego lo adaptasss..... ![Lightsabre :lightsabre:](https://solocodigo.com/Smileys/solocodigo/lightsabre.gif) espero que te sea de ayuda.. Un saludo...
2
« en: Miércoles 20 de Junio de 2007, 18:54 »
EEEiiiiii !!! Muchísimas gracias por responder al mensaje! Ya solucioné el problema de las DLL!! se cargan en la carpeta System16Folder del InstallShield!!! Me surgió otro problema y es que con win98 me daba un thread error (6)....... cada vez que se ejecutava un nuevo thread.... El origen del problema esta en el sistema operativo! he provado con un windows2000 y con un windowsXP y el programa una vez cargadas las librería funciona correctamente. Yo había pensado que el problema podría pasar por las gdi ya que he programado el programa en XP y lo ejecuto en 98 (que no tenga un problema con las librerías graficassss) aunque bueno, intenté cargar la gdi32.dll y me petó el win98....no arrancaba, aunque le cargué desde ms2 el antiguo y funcionó!! He acabado por hacerlo correr sobre un NT.....desistí Muchas gracias!!! y si a alguién se le ocurre que puede ser.....ya dirá!!! Saludos
3
« en: Martes 19 de Junio de 2007, 10:36 »
Buenas!!! Tengo un pequeño problema....he creado un software con C++ Builder y ahora me dispongo a crear el instalador con InstallShield de Borland (utilizo Borland 6). "No sé muy bién cómo funciona..." El caso es que mi programa utiliza una DLL y varias librerías.... No sé cómo debo hacer para cargar la DLL a la carpeta system (o system32) desde InstallShield y tampoco que debo hacer para cargar mi programa en Regedit!! He ejecutado el programa en un win98 dónde debe ir y me da un error "no se pudo encontrar la DLL".... la he cargado manualmente pero no funciona... Saludos, espero que alguién me pueda echar un cable....
4
« en: Domingo 17 de Junio de 2007, 15:56 »
fE dE errAtaS: Hay un pequeño error en la 5 linea de EXECUTE, debe canviarse first por firsloop... saludos
5
« en: Domingo 17 de Junio de 2007, 14:09 »
Muy buenas!!!! Aquí os paso una posible solución para temporizar un thread en milisegundos....ESPERO QUE OS SEA DE AYUDA..... es una posible solución sin utilizar timers... (no sé a ver que os parece....): my.hclass Mythread : public TThread { private: SYSTEMTIME systime_Now; SYSTEMTIME systime_Start; protected: void __fastcall Execute(void); void __fastcall UpdateLabel(void); public: bool Cond; int i; long lNow; long lStart; bool firstloop; long dif; __fastcall Mythread(bool CreateSuspended); }; my.cpp__fastcall Mythread::Mythread(bool CreateSuspended) : TThread(CreateSuspended) { Cond = true; firstloop = true; } //--------------------------------------------------------------------------- void __fastcall Mythread::Execute(void) { do { GetSystemTime(&systime_Start); if(first == true) { Synchronize(&UpdateLabel) Sleep(600);// depende del tiempo de ejecución del thread... } else { GetSystemTime(&systime_Now); lNow = systime_Now.wMilliseconds + 1000 * (systime_Now.wSecond +60 * (systime_Now.wMinute + 60 * (long) systime_Now.wHour)); dif = difftime(lNow, lStart); if(dif >= 1000) // que se ejecute cada segundo... { Synchronize(&UpdateLabel) Sleep(600);// depende del tiempo de ejecución del thread... } } } while(Cond == true); } //--------------------------------------------------------------------------- void __fastcall Mythread::UpdateLabel(void) { lStart = systime_Start.wMilliseconds + 1000 * (systime_Start.wSecond + 60 * (systime_Start.wMinute + 60 * (long) systime_Start.wHour)); firstloop = false; /* introducir aquí el codigo de ejecución del thread */ if(/*condición de salida*/) Cond = false; } bYE
6
« en: Sábado 16 de Junio de 2007, 02:05 »
![Comp :comp:](https://solocodigo.com/Smileys/solocodigo/comp.gif) gracias...voy a provar!!Ya hos comentaré la solución.... Un saludo
7
« en: Sábado 16 de Junio de 2007, 00:56 »
Muchíiisimas gracias!!! Tengo la función UINT_PTR SetTimer(HWND hWnd,UINT_PTR nIDEvent,UINT uElapse, TIMERPROC lpTimerFunc);Si sólo me interesa controlarlo desde su llamada necesito el Handle?? ya que sinó nIDEvent se ignora! En ese caso sólo debería introducir el tiempo y dejar TimpeProc NULL si no quiero controlar el TimeOut?¡ Debería quitar el While y dejar que el tiemer me sincronize el thread?? XD.
8
« en: Sábado 16 de Junio de 2007, 00:27 »
Buenas a todos! Estoy intentando sincronizar un thread para que ejecute su código cada 1 segundo (en windows...intento evitar las interrupciones..) He provado con timer_t timer() de <timer.h> pero me lo permite en segundos. También he provado con Delay() y Sleep() en un While dentro del método Execute... El tiempo de ejecución del Thread variable ( 400 a 800 ms). Me interesa controlar el tiempo en milisegundos. ¿¿Alguna función que me lo permita?? ¿¿Puedo introducir un timer dentro del método Execute de un Thread?? Saludos!!
9
« en: Miércoles 13 de Junio de 2007, 15:04 »
Muchas gracias por tu tiempo, me a sido de gran ayuda!! Saludos
10
« en: Miércoles 13 de Junio de 2007, 14:30 »
Ok, a ver si entendí.. El hilo1 en WaitForSingleObjecte obtiene el handle del mutex. Si otros hilos hacen la petición quedaran esperando hasta que se haga ReleaseMutex y puedan obtener el handle del mutex, no??. O sea que si protejo la función Execute() del Thread, no tendra acceso hasta que en algun momento pueda obtener ese HANDLE!! Lo de las series: Tengo un DBChart con tres series (Series1, Series2, i 3), un grafico de líneas con tres líneas independientes de colores distintos (cada una de ellas es una serie). Cada una es manipulada por un thread. Es correcto el planteamiento que hago para solucionar el problema o puedo hacerlo de otras formas? El problema que tengo es que los threads se intercanvian los datos que imprimen en la grafica...o sea que parece que no se proteja bién la función con los Mutex. Un saludo y gracias!!
11
« en: Miércoles 13 de Junio de 2007, 12:30 »
buenas... mi intención es poder pintar un grafico con tres series a la vez.... para ello he creado tres threads, uno para cada serie, que se encargan llamar a una función ( los tres llaman a la misma ) que retorna el valor que debe imprimir en el grafico. He creado los mutex para proteger la función, aunque no sé si es correcto protegerla de la forma que muestro arriba... Debo quizas introducir el codigo de ejecución del thread dentro de WAIT_OBJECT_0 ? es que no sé exactamente si manipulo correctamente el HANDLE!! gracias por contestar..
12
« en: Miércoles 13 de Junio de 2007, 11:24 »
Buenas.. Tengo un problema con unos threads que acceden a una misma función. He intentado protegerlos con mutex, lo que no sé si lo hago bién. Mi planteamiento es el siguiente: En un Form1 tengo la función y creo el mutex con SemMutex1 = CreateMutex(NULL, false, "ReadDirectSem"); en el header declaro HANDLE SemMutex1; "como private". En un Form2 tengo los threads, encargados de pintar una grafica en diferentes series. Declaro el HANDLE de la misma forma. En el thread tengo el siguiente código: __fastcall WriteMeasure1::WriteMeasure1(bool CreateSuspended) : TThread(CreateSuspended){ SemMutex1 = OpenMutex(NULL, false, "ReadDirectSem"); Cond = true; } void __fastcall WriteMeasure1::Execute(void){ do{ Synchronize(&UpdateLabel1); Sleep(500); }while(Cond == true); } void __fastcall WriteMeasure1::UpdateOutput(void){ WaitForSingleObject(SemMutex1, INFINITE); //mi función del Form1 //aquí la funcíón me retorna los valores que imprimo en el grafico.... ReleaseMutex(SemMutex1); if(condiciones de salida) Cond = false; } Tengo tres threads que acceden a la misma función. El problema es el siguiente: A los 30 segundos de funcionar, los valores que se pintan en la grafica se mezclan, es decir, que en la Serie1 (thread1) se me pintan los valores que me retorna el Thread2, etc. entre ellos se intercanvian estos valores...... Es correcto el código, cómo puedo comprovar si el thread toma el HANDLE del mutex?? He visto algún ejemplo dónde se emplea un switch - case, pero es necesario?? Espero que alguien me pueda echar un cable.....gracias...
13
« en: Lunes 11 de Junio de 2007, 19:40 »
Uooooo!! no me he dado cuenta del nombre de la variable!!!! voy a provar tu consejo, gracias otra vez!!
14
« en: Lunes 11 de Junio de 2007, 19:34 »
Buenas!! Lo que me interesa es el entero y los flotantes, el buffer lo utilizo como contenedor para los ';' que separan los campos del fichero y de esa forma me olvido de ellos...!!! XD.
15
« en: Lunes 11 de Junio de 2007, 16:23 »
![Alien :alien:](https://solocodigo.com/Smileys/solocodigo/alien.gif) Aloooo! la pregunta parece un poco absurda, pero bueno, no sabía que hacer y estaba mal orientada al buscar información..... La sulución es muy simple: fp = fopen((const char*)OpenTextFileDialog1->FileName.c_str(), "r"); Saludos!!
16
« en: Lunes 11 de Junio de 2007, 14:04 »
para leer una línea hago lo que se muestra a continuación....luego sólo hay que añadir un bucle......y tratar las variables..... char buffer[100]; FILE* fp; typedef struct{ int a; float b; float c; }Script; Script var; memset(buffer,'\0',100); fp = fopen("prueva.csv", "r"); if(fp == NULL) Memo1->Lines->Add("File could not be opened.."); else{ ..... fscanf(fp, "%[^\n]",buffer); fscanf(fp, "%c", buffer); fscanf(fp, "%d", &var.a); fscanf(fp, "%c", buffer); fscanf(fp, "%f", &var. ![Cool B)](https://solocodigo.com/Smileys/solocodigo/cool.gif) ; fscanf(fp, "%c", buffer); fscanf(fp, "%f", &var.c); fscanf(fp, "%c", buffer); } .... Saludos!!
17
« en: Lunes 11 de Junio de 2007, 13:05 »
Hola a todos!!! Necesito convertir un Ansistring obtenido de la siguiente forma: Label2->Caption = OpenTextFileDialog1->FileName.c_str(); y deseo que sea un const char para utilizarlo en la función fopen(" ----","r"); Alguien me puede echar un cable??? Saludos
18
« en: Lunes 11 de Junio de 2007, 12:30 »
buenas!!! Los ficheros CSV (del inglés comma-separated values) son un tipo de documento sencillo para representar datos en forma de tabla, en las que las columnas se separan por comas (o punto y coma en donde la coma es el separador decimal: España, Francia, Italia...) y las filas por saltos de línea. Los campos que contengan una coma, un salto de línea o una comilla doble deben ser encerrados entre comillas dobles. gracias por contestar.... xd
19
« en: Sábado 9 de Junio de 2007, 15:06 »
Saudos!!! Necesito pasar a un Array los campos de un fichero CSV dónde tengo habilitadas 3 columnas y 'X' filas. Hasta el momento consigo leer el fichero con las funciones fgets o fgetc y puts de stdio.h El objetivo es poder leer una fila del fichero, separar los 3 campos en un array o asociarlos a tres variables... y esperar un TIEMPO "T", que viene dado por el campo de tercera columna del CSV, para leer la siguiente fila. Hasta el momento he hecho lo siguiente: FILE* fp; char sLine[10]; fp = fopen("plantilla.csv", "r"); if(fp == NULL) Memo1->Lines->Add("File could not be opened.."); fgets(sLine, 10, fp); puts(sLine); Puedo ver que sLine contiene toda la primera línea del fichero. La pregunta es cómo puedo hacer para leer línea a línea y crear un array con los resultados. Me interesa leer a partir de la segunda línea del CSV. Otra pregunta cómo hago con fopen para no tener que pasarle el nombre del fichero directo si utilizo un dialog con el que utilizando la función OpenTextFileDialog1->FileName.c_str(); me devuelve la ruta entera. Puedo pasarle la ruta a fopen de alguna forma?? ![Lightsabre :lightsabre:](https://solocodigo.com/Smileys/solocodigo/lightsabre.gif) un saludo para todos!!
20
« en: Viernes 1 de Junio de 2007, 10:56 »
21
« en: Jueves 31 de Mayo de 2007, 23:50 »
Hola a todos, Quería saber como montra un string en una variable para imprimir en una sola línea de una "Memo":....... "la fecha", "la hora" y "otros caracteres"... Utilizo la clase systdate.h.
Mi pregunta es de que tipo debe ser la variable "Time" que muesto a continuación:
Time = Now().TimeString(); Date = ...
Y cómo debo imprimirla si deseo montarme un string con la función sprintF( %--- %---, Date, Time);
Saludos al foro...
xd
22
« en: Jueves 31 de Mayo de 2007, 00:15 »
Voy a detallar un pokito mas..
El programa consta de un Form1 principal con el que mediante botones se llama a otros forms.
El fom2 (el del caso en cuestión) tiene un Label en el que escribo con un thread de la siguiente forma:
//--------------------------------------------------------------------------- void __fastcall WriteMeasure::Execute(void) { do { Synchronize(&UpdateLabel); Sleep(100); } while(Cond == true); }
//--------------------------------------------------------------------------- void __fastcall WriteMeasure::UpdateLabel(void) { //variables declaradas en Form2.h
Form1->ReadParameterDirect(iNode, 1, 0, 2, 0, 200, sAnswer, iErrVal, bytStatus, sErrVal);
if(strlen(sErrVal) == 0) Form2->Label8->Caption = sAnswer;
if(Form2->Visible == false) Cond = false; }
Además tiene un DBChart que grafía la variable sAnswer.....
Puedo leer mediante este hilo el caudal de todas las valvulas pero se me escriben todas las respuestas (sAnswer) en el mismo Form2->Label8..
Mi pregunta es.. con hilos puedo crear varios Form2 para que se me escriba cada respuesta (sAnswer) en un Form2->Label8 (HILO1); Form2->Label8 (HILO2).....
HAY alguna función o "algo" tipo...: Form2->Create(Form2hilo, Form2).... o algo por el estilo que me lo permita??
xd
23
« en: Miércoles 30 de Mayo de 2007, 23:39 »
Al clicar un botón hago una llamada al Thread (codigo que has visto antes) y me interesa que me clone un Form.
El caso es el siguiente:
tengo tres valvulas digitales a las que les mido el caudal.
En un Form tengo un DBChart que grafican el valor leído.
me interessa utilizar el mismo form haciendo que se ejecute como un hilo....
saludos y gracias.
24
« en: Miércoles 30 de Mayo de 2007, 23:06 »
Hola a todos...
Tengo una duda, y es que tengo el siguiente "codigo.h":
class OpenSimpleGraphic : public TThread { private: HANDLE hSemaphore; protected: void __fastcall Execute(void); void __fastcall UpdateForm(void); public: bool Cond; __fastcall OpenSimpleGraphic(bool CreateSuspended); };
..y me interesaría que en el "codigo.cpp", concretamente en "UpdateForm(void) {----}", se me clonara un Form....
Alguien me echa un cable???
xd.
Páginas: [1]
|
|
|