Ver Mensaje Individual
  #1  
Antiguo 27-01-2006
Seba.F1 Seba.F1 is offline
Registrado
 
Registrado: nov 2004
Ubicación: ER - Argentina
Posts: 7
Reputación: 0
Seba.F1 Va por buen camino
Angry Thread bendito thread...se me pierde la ventana

Hola gente como andan? llevo mas de 3 horas buscando en los foros de club delphi e internet algo que me ayude con mi problema pero no encuentro nada, si no les molesta a los que mas saben por favor denme una mano, o un pie o algo por favor!!!!!!!! estoy por volverme loco.

EL PROBLEMA
He desarrollado una aplicación que entre muchas cosas, lee datos de una balanza electrónica que pesa camiones (cuando comence con el desarrollo ya estaba). La cuestión es que esta balanza usa un ejecutable en DOS (si Disk Operating Sistem de Micro...), cuando lo ejecuto con cierta sintaxis me devuelve el valor del peso en un archivo .txt. Hasta aca todo bien. Por cuestiones de tiempo (demoras del archivito, mostrar los datos, etc) tuve que implementar un thread para que la aplicación pueda realizar otras tareas mientras pesa los camiones, y ejecuto dentro del thread el programita de la balanza, luego leo el archivo .txt y muestro el numerito en LA aplicación, cuando deja de pesar, se termina el thread, imprime el ticket y cuando cierro la ventana de la balanza, puuuuuuuuffffff,!"·$·$|@#~&·$&|@#~%&|@#~€|34% me tira el siguiente error (obviamente le meti un par de try except... y muestra un lindo mensajito).

Error Win32 Code1400
El identificador de la ventana no es válido

todo bien hasta que se quiere volver a abrir la ventana de la balanza.

Ya existe un componente con el nombre F_Balanza.

y no me lo deja crear, y cuando cierro la aplicaciópn paaaaaaassfff

violacion de acceso a la direccion 7c928fea en el módulo ntdll.dll

aca va el codigo de mi thread, junto con el que dispara el ejecutable de la balanza.

por favor les pido que si alguien me pude decir donde le estoy errando, porque ya no veo nada.


Código Delphi [-]
function T_Lectura_Balanza.Ejecutar(const AppName, Params:String):THandle;
var
   ProcInfo:TProcessInformation;
   Info:TStartupInfo;
begin
     FillChar(Info,SizeOf(Info),0);
     Info.cb:=SizeOf(Info);
     Info.dwFlags:=STARTF_USESHOWWINDOW;
     info.wShowWindow:=SW_HIDE;
     if not CreateProcess(nil, pchar(AppName+' '+Params),nil,nil,False,0,nil,nil,Info,ProcInfo) then
        raise Exception.Create('No se puede iniciar la lectura de la balanza.');
     Result:=ProcInfo.hProcess;
end;
procedure T_Lectura_Balanza.Esperar(H:THandle);
begin
     while WaitForSingleObject(H,100)=WAIT_TIMEOUT do
           begin
                Application.ProcessMessages;
                if Application.Terminated then
                   Break;
                if F_Balanza.Terminar then
                   Break;
           end;
end;
 
 
procedure T_Lectura_Balanza.Execute;
begin      Linea_Comando:=MD_Config.IBQ_CONFIGLINEA_COMANDO_BALANZA.AsString;
     repeat
           try
              Esperar(Ejecutar(Linea_Comando,''));
              Archivo_Peso:=F_Principal.Dir+'Peso';
              F_Balanza.Memo_Peso.Lines.LoadFromFile(Archivo_Peso);
              Archivo_Peso:=F_Balanza.Memo_Peso.Lines[0];
              if Archivo_Peso='E' then
                 begin
                      F_Balanza.Img_Error.Visible:=True;
                 end
              else
                  begin
                       F_Balanza.Img_Error.Visible:=False;
                       Peso:=Copy(Archivo_Peso,2,(Length(Archivo_Peso)-1));
                       try
                          Long_:=StrToFloat(Peso);
                       except
                             Long_:=0;
                       end;
                       if Long_=0 then
                          F_Balanza.Img_Cero.Visible:=True
                       else
                           F_Balanza.Img_Cero.Visible:=False;
                       F_Balanza.Kg:=Long_;
                       Decodificar_Numero(Long_,CM,DM,UM,C,D,U);
                       Mostrar(CM,DM,UM,C,D,U);
                  end;
          except
                 Decodificar_Numero(0,CM,DM,UM,C,D,U);
                 Mostrar(CM,DM,UM,C,D,U);
                 F_Balanza.Img_Cero.Visible:=True;
           end;
     until F_Balanza.Terminar;
end;

desde ya muchas gracias.
Responder Con Cita