Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-04-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 548
Poder: 17
jhonalone Va por buen camino
Haré caso a Neftalí y estudiaré los Threads que no los he utilizado nunca. Como sabéis no soy profesional de ésto, sólo un aficionado y por lo que estoy viendo bastante TORPE.

Tan inútil que una vez intenté subir unos vídeos al foro y no se llegaron a ver. Si supiera hacerlo, grabaría el tiempo que tarda el programa en arrancar en windows, con las mismas instrucciones, arranca casi instantáneo.

Es mi primer programa para FMX y lleva las mismas instrucciones adaptadas a FMX que el que tenía hecho en Win. No esperaba que tardara tanto en arrancar.

Lo dicho, voy estudiar y ya os contaré.

Saludos.
Responder Con Cita
  #2  
Antiguo 09-04-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
El thread no es una solucion magica. Tu algoritmo es ineficiente, o estas haciendo algo que no nos estas diciendo que es muy ineficiente

Si ahora colocas el thread y mueves todo el proceso ahi adentro, supongamos que funciona. Ok, la app arranca, sale el logo de firemonkey y luego vas a ver la "pantalla inicial". El problema de tu programa es que hasta que no terminas de generar todos los tableros, no se puede usar para nada. En definitiva vas a tener mas problemas, porque vas a tener que bloquear la pantalla inicial y desbloquearla hasta que se termine de calcular todo

Ademas, de que la programacion con hilos no es algo para nada sencillo, sobre todo en casos como este en el que tienes que sincronizarte con el hilo principal para actualizar componentes visuales

Lo que debes aprender a hacer es depurar y estudiar tu codigo. Descubre que es lo que tarda. Vuelvo a preguntarte: Como generas los tableros? Es un algoritmo tuyo? O buscaste informacion? Quiza haya alguna propiedad o "algo" que se puede aprovechar para que se genere el tablero de forma muuuy rapida

Tambien podrias publicar tu codigo para que lo veamos
Responder Con Cita
  #3  
Antiguo 09-04-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 548
Poder: 17
jhonalone Va por buen camino
Gracias de nuevo. Agustín.
Tienes razón, llevo toda la tarde leyendo sobre los Threads y todavía no he aprendido a implementarlos, a parte de que he leído que son bastante delicados, es decir: que si te equivocas... ¡paf!.

Te pongo el procedimiento de generar tablero. Te comento que tengo declarado un TStringGrid de 3x3 para cada cuadro del tablero que presenta 9 números provisionales o los oculta, según...

Código Delphi [-]
procedure GenerarTablero(var Tablero: TTablero; Dificultad: Integer; Personal:Boolean);
var
  i,j,k,l, Tope, Tope2: integer;
begin
EsDinamico := False;
TableroYaResuelto := False;
// Eliminamosm las listas de Deshacer
Princi.UndoList.Clear;
Princi.RedoList.Clear;

    SeVenTodosProvis := False;
    SeVenParteProvis := False;
    PrimeraVezDosClick := True; //Para generar los Tableros Provis la primera vez
                                // Lo hace al pintar el tablero por primera vez
Princi.Timer1.Enabled := False; // Arrancamos con el contador de 2 clicks parado
Princi.Button13.Enabled := False; // Inhabilitamos Undo
Princi.Button16.Enabled := False; // Inhabilitamos Redo
//Eliminamos todos los cuadros provisionales, si hay
Princi.EliminaProvis;

  for i:=0 to 8 do
    for j:=0 to 8 do
    begin
    TableroProvis[i,j]:=0;  // Ponemos a ceros el tablero de Provisionales
    TableroAyudado[i,j]:=0;  // Ponemos a ceros el tablero de ayuda
    ProvisVisibles[i,j]:=0;
    ProvisPuestos[i,j]:=0;
    ProvisRecuperables[i,j]:=0;
    end;

// Actualizamos el estado de los botones y del tablero
    Princi.grdTablero.Enabled := True;
    Princi.Button1.Enabled := True;
    Princi.Button2.Enabled := True;
    Princi.Button3.Enabled := True;
    Princi.Button4.Enabled := True;
    Princi.Button5.Enabled := True;
    Princi.Button6.Enabled := True;
    Princi.Button7.Enabled := True;
    Princi.Button8.Enabled := True;
    Princi.Button9.Enabled := True;
    Princi.Button10.Enabled := True;
    Princi.Button11.Enabled := True;
    Princi.Button12.Enabled := True;

    Princi.Button13.Enabled := False;
             Princi.Image1.Enabled :=False;
    Princi.Button14.Enabled := True;
             Princi.Image2.Enabled := True;
    Princi.Button15.Enabled := True;
             Princi.Image3.Enabled :=True;
    Princi.Button16.Enabled := False;
             Princi.Image4.Enabled :=False;

// Actualizamos la etiqueta con el nivel
if not Personal
then begin Case Dificultad of
           0: Princi.Label3.Text := 'Nivel SENCILLO';
           15: Princi.Label3.Text := 'Nivel NORMAL';
           25: Princi.Label3.Text := 'Nivel DIFÍCIL';
           30: Princi.Label3.Text := 'Nivel MUY DIFÍCIL';
           end; //Case
     end else Princi.Label3.Text := 'Nivel PERSONALIZADO';

// Comenzamos a generar el nuevo tablero
  FillChar(Tablero,Sizeof(Tablero),0);
  Randomize;
  i:= 0;
  while i < NUM_COLUMNAS do
  begin
    j:= Random(9)+1; // No recuerdo por qué +1 pero en VCL lo tengo así ¿?  hace años (a lo mejor esto sobra)
    if Valido(Tablero, i, 0, j) then
    begin
      Tablero[i,0]:= j;
      inc(i)
    end;
  end;  // EXIT;  //Pruebas
  Resolver(Tablero);
  TableroResuelto := Tablero;


  k:= 0;
  if Personal then begin
                   if Dificultad > 30
                   then Tope:=30
                   else Tope:=Dificultad;
                   end
              else Tope:=30;

// Quitamos 30 obvios
  while k < Tope do
  begin
    i:= Random(NUM_COLUMNAS);
    j:= Random(NUM_FILAS);
    if Tablero[i,j] <> 0 then
    begin
      l:= Tablero[i,j];
      Tablero[i,j]:= 0;
      if Obvio(Tablero,i,j)>0 then
        inc(k)
      else
        Tablero[i,j]:= l;
    end;
  end;

  k:= 0;
if not Personal then tope2:=Dificultad
                else tope2:=Dificultad - Tope;

  // Quitamos algunos que no son obvios SEGUN NIVEL 0, 15, 25, 30, PERSONAL
  while k < Tope2 do
  begin
    i:= Random(NUM_COLUMNAS);
    j:= Random(NUM_FILAS);
    if Tablero[i,j] <> 0 then
    begin
      l:= Tablero[i,j];
      Tablero[i,j]:= 0;
      if Obvio(Tablero,i,j)=0 then
        inc(k)
      else
        Tablero[i,j]:= l;
    end;
  end;

EventoFlechaActivo := False;
end;

Las funciones, como verás casi me sirven las mismas con algunos retoques y unas pocas nuevas.

Al final con el tema de los Threads voy a tener que usar una pantalla de inicio, como la que ya tengo, con la que he conseguido dividir el tiempo de espera entre 2. Y te recuerdo que en los móviles nuevos, 5/7 segundos no es mucho. Con evitar que la pantalla quedara en negro... quizá sería suficiente. Quizá pueda optimizar el flujo recolocando algunos procesos...

Un saludo.
Responder Con Cita
  #4  
Antiguo 09-04-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 548
Poder: 17
jhonalone Va por buen camino
-Bueno.
Ahora recuerdo por qué tengo puesto:
Código Delphi [-]
 j:= Random(9)+1; // No recuerdo por qué +1 pero en VCL lo tengo así ¿?  hace años (a lo mejor esto sobra)
Es porque el número recibido de Random está entre 0 y 9-1.
Saludos.
Responder Con Cita
  #5  
Antiguo 09-04-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
No se que haran algunas de las funciones a las que invocas dentro de ese codigo (Obvio y Valido por ej)

La otra solucion es que "tu" crees tu form splash

Hay un articulo que dice como hacerlo en FMX: revisalo
Responder Con Cita
  #6  
Antiguo 10-04-2016
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 548
Poder: 17
jhonalone Va por buen camino
Hola Agustín.
Gracias por tu interés.
En Madrid son mas de las 12 de la noche y estoy cansado. Mañana reviso el enlace.
Las funciones de comprobación son muy simples.
Te pongo un par de ellas de las más complicadas:
Código Delphi [-]
 function Fila(Tablero: TTablero; y,n: Integer): boolean;
var
  x: Integer;
begin
  Result:= TRUE;
  x:= 0;
  while (x < NUM_COLUMNAS) and Result do
  begin
    if Tablero[x,y] = n then
      Result:= FALSE;
    inc(x);
  end;
end;

function Valido(Tablero: TTablero; x,y,n: Integer): boolean;
begin
  Result:= Fila(Tablero,y,n) and Columna(Tablero,x,n)
    and Cuadrante(Tablero,x,y,n);
end;

function Obvio(Tablero: TTablero; x,y: Integer): Integer;
var
 i,j,n: Integer;
begin
 j:= 0; n:= 0;
 for i:=1 to 9 do
   if Valido(Tablero,x,y,i) then
   begin
     n:= i;
     inc(j);
   end;
 if j=1 then
   Result:= n
 else
   Result:= 0;
end;

He estado haciendo mediciones de tiempo en distintos dispositivos:
En la Tablet Samsung Galaxy Tab3 tarda 31/32 seg.
En teléfono Samsung Galaxy S III mini 12 seg.
En teléfono Samsung Galaxy A3 7 seg.

Está claro que depende del procesador implicado.

Creo que me va a servir el enlace que me has dejado. Estoy convencido de que sólo necesito no dejar la pantalla en negro, para que el usuario no quede sorprendido y desinformado.

Buenas noches para mi y buenas tardes para ti.

Saludos.
Responder Con Cita
  #7  
Antiguo 10-04-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Es que ese algoritmo, a simple vista solamente, ya se ve que tiene un orden de tiempo de ejecucion mucho mas elevado de lo que te parece

Debe haber alguna magica propiedad matematica que permita generar estos tableros de una forma mucho mas rapida

Hay bucles en los que invocas a funciones que invocan a mas bucles... y esto se repite con varias veces de anidamiento
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
BASS Firemonkey Radio Player Delphi XE7 - Pantalla Negra en Android wolfran_hack FireMonkey 3 27-07-2021 18:04:30
pantalla negra en motorola droid a855 kurono Desarrollo en Delphi para Android 5 21-03-2015 00:15:39
Android SQLite pantalla negra Davidecr Desarrollo en Delphi para Android 9 17-03-2014 18:41:09
Delphi + WebCam + Pantalla Negra pape19 Varios 6 21-12-2012 01:32:00
Capturar Pantalla = Pantalla negra DarkDudae Gráficos 8 27-10-2008 12:29:36


La franja horaria es GMT +2. Ahora son las 01:17:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi