Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-04-2016
Ramsay Ramsay is offline
Miembro
NULL
 
Registrado: ene 2016
Posts: 104
Poder: 9
Ramsay Va por buen camino
Threads en unit

Hola , estoy haciendo una unit que hace multithreading , el codigo de la unit :

Código Delphi [-]
unit probando;

{$POINTERMATH ON}

interface

uses
  System.SysUtils, Vcl.Dialogs, Windows, TlHelp32, ShellApi,
  Classes, Math, Vcl.Forms, Vcl.Imaging.jpeg, Vcl.StdCtrls, Vcl.Graphics,
  Vcl.Controls,
  ComObj, ActiveX, Variants, Messages;

type
  T_probando = class
  private

  public
    constructor Create;
    destructor Destroy; override;
    function loader_tester(argument: string; count: integer): string;
  end;

implementation

constructor T_probando.Create;
begin
  inherited Create;
  //
end;

destructor T_probando.Destroy;
begin
  inherited Destroy;
end;

// Function loader_tester

type
  thread_loader_tester = class(TThread)
  protected
    procedure Execute; override;
  public
    argument: string;
  end;

procedure thread_loader_tester.Execute;
var
  command: string;
  info: string;
begin
  TThread.Synchronize(nil,
    procedure
    begin
      command := 'c:/xampp/titulo.txt';
      info := '';
      ShellExecute(0, 'open', Pchar(command), Pchar(info), nil, SW_NORMAL);
    end);
end;

function T_probando.loader_tester(argument: string; count: integer): string;
var
  thread_now: thread_loader_tester;
  i: integer;
  fThreadRefCount: integer;
  check: integer;
begin
  try
    fThreadRefCount := 0;
    begin

      For i := 1 to count do
      begin
        thread_now := thread_loader_tester.Create(True);
        thread_now.argument := argument;
        thread_now.FreeOnTerminate := True;
        thread_now.Start;
        Inc(fThreadRefCount);
      end;

      While fThreadRefCount > 1 do
      // While (fThreadRefCount > 1) and (fThreadRefCount < count) do
      begin
        Application.ProcessMessages;
        CheckSynchronize;
      end;

      Result := 'ok';
    end;
    Result := 'ok';
  except
    begin
      Result := 'error';
    end;
  end;
end;

end.

Debe funcionar tanto en aplicaciones graficas como en consola , lamentablemente estoy mejorandola para que funcione en consolas , el codigo de la consola.

Código Delphi [-]
program test;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  Windows, System.SysUtils, probando;

var
  test_now: T_probando;

begin
  try
    test_now := T_probando.Create();
    Writeln('[+] Response');
    Writeln('response : '+test_now.loader_tester('c:/xampp/titulo.txt', 5));
    Readln;
  except
    on E: Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;

end.

Funciona , pero entra en un ciclo infinito :

Código Delphi [-]
While fThreadRefCount > 1 do

Intente checkeando que verificara la cantidad de threads y ahi terminara :

Código Delphi [-]
While (fThreadRefCount > 1) and (fThreadRefCount < count) do

Pero si hago esto no se ejecuta ningun thread.



¿ Alguien podria ayudarme ?
Responder Con Cita
  #2  
Antiguo 12-04-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Pensaría que quizá necesitas hacer un decremento de fThreadRefCount en el ciclo:


Código Delphi [-]
     While fThreadRefCount > 1 do
      begin
        Application.ProcessMessages;
        CheckSynchronize;
        Dec(fThreadRefCount); //Algo así quizá...
      end;
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #3  
Antiguo 12-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 entiendo nada de tu codigo

Por que usas un Syncronize para ejecutar un ShellExecute? Eso ya esta creando un proceso externo a tu aplicacion, no hace falta que sincronices nada

Por que el Application.ProcessMessages?
Por que el CheckSynchronize?
Responder Con Cita
  #4  
Antiguo 12-04-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 30
jhonny Va camino a la famajhonny Va camino a la fama
Cita:
Empezado por AgustinOrtu Ver Mensaje
No entiendo nada de tu codigo

Por que usas un Syncronize para ejecutar un ShellExecute? Eso ya esta creando un proceso externo a tu aplicacion, no hace falta que sincronices nada

Por que el Application.ProcessMessages?
Por que el CheckSynchronize?
Bueno, me hago las mismas preguntas, aunque asumí que son "para algo" y ya, por eso mi respuesta.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #5  
Antiguo 12-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
Para aplicaciones de consola, si se debe usar CheckSynchronize

Lee la documentacion

Es necesario asignar el valor del metodo a WakeMainThread El problema es que desde una aplicacion con interfaz grafica no deberias tocar esa variable, y usar TThread.Syncronize

Yo me replantearia el diseño
Responder Con Cita
  #6  
Antiguo 13-04-2016
Ramsay Ramsay is offline
Miembro
NULL
 
Registrado: ene 2016
Posts: 104
Poder: 9
Ramsay Va por buen camino
El shellexecute es solo un ejemplo , en esa parte del codigo va todo el funcionamiento o el codigo que agregare en el futuro.Estoy estudiando multithreads pero hay muy pocos ejemplos.
Responder Con Cita
  #7  
Antiguo 13-04-2016
Ramsay Ramsay is offline
Miembro
NULL
 
Registrado: ene 2016
Posts: 104
Poder: 9
Ramsay Va por buen camino
Perdon , hago otro post porque me olvide de un detalle importante , uso Synchronize porque estoy usandolo en una consola.
Responder Con Cita
  #8  
Antiguo 14-04-2016
DopeRider DopeRider is offline
Registrado
NULL
 
Registrado: mar 2013
Posts: 3
Poder: 0
DopeRider Va por buen camino
Cita:
Empezado por Ramsay Ver Mensaje
Hola , estoy haciendo una unit que hace multithreading , el codigo de la unit : (...) ¿ Alguien podria ayudarme ?
¿Qué problema estás tratando de solucionar?
Responder Con Cita
Respuesta



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
mostrar 2 raise de una unit dentro de un try except de otra unit fuera del IDE fcios Varios 1 31-12-2015 12:05:20
Threads y DataModule brandolin OOP 5 20-10-2011 21:33:31
uso de threads JULIPO API de Windows 2 25-07-2007 16:09:06
Threads in DLL's Gianni Varios 0 20-07-2007 22:18:23
Threads y transacciones anduj Conexión con bases de datos 5 12-07-2005 20:31:40


La franja horaria es GMT +2. Ahora son las 21:03:47.


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