PDA

Ver la Versión Completa : Dudas con Threads en Delphi


Anonim0
20-12-2010, 19:53:51
Saludos a todos. Tengo un par de dudas con respecto al uso de Threads/Hilos en Delphi:

Primero: Con CreateThread como le puedo pasar un parámetro de tipo String a una función? Había intentado algo así pero nada:

procedure MiFuncion(Param: String);
begin
ShowMessage(Param);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
ID : Cardinal;
s : String;
begin
s := 'hola';
CreateThread(nil, 0, @MiFuncion, @s, 0, ID);
end;

------------------

Segundo: En Delphi que es mas recomendable utilizar BeginThread de SysUtils o directamente CreateThread?

rgstuamigo
20-12-2010, 21:20:17
Primero que nada creo que deberías averiguar los parámetros de la funcion CreateThread (http://msdn.microsoft.com/en-us/library/ms682453%28v=vs.85%29.aspx) en la propia página de Microsoft.;),
Segundo.- Para Trabajar con Hilos, Delphi ya posee una Clase preparada(Clase TThread) para tal, tú tan solo debes crearte una clase descendiente de ésta y sobreescribir el método Execute para ejecutar algun proceso o una tarea deseada, inclusive Delphi posee un Asistente(Wizard) que te fascilita el trabajo de crecion de Hilos;).

Por otra parte sería mas conveniente que explicaras exactamente lo que deseas hacer y el por qué estas queriendo utilizar directamente las API de windows para crear hilo siendo que, ya delphi hace el trabajo por tí ? :confused:

Saludos...:)

escafandra
21-12-2010, 00:36:49
Independientemente de los motivos por los que has decidido usar la API directamente, el principal problema está en la declaración de la función que quieres ejecutar en el hilo. No puede ser un procedimiento sino una función y debe ser stdcall:

function MiFuncion(Param: PCHAR): DWORD; stdcall;
begin
MessageBox(0, 0, Param, 0);
Result := 0;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
ID : Cardinal;
s : String;
begin
s := 'hola';
CreateThread(nil, 0, @MiFuncion, PCHAR(s), 0, ID);
end;


Saludos.

TaaDow
14-01-2011, 23:43:41
Tengo un procedimiento al cual le envío dos parámetros, con estos se procesa con un ciclo, estos toman bastante tiempo para culminarse, por lo tanto me bloquea la pantalla, según he leído la solución podría ser hacer un hilo que ejecute esa función, pero la duda es ¿como enviarle a la función del hilo los parametros?, agradezco sus respuestas.

type
Tinserts = class(TThread)
private
i: Integer;
{ Private declarations }
protected
procedure Actualiza_pgb;
procedure Execute; override;
end;
/**********************************/
la funcion del hilo

procedure Tinserts.Execute;
var
li:Integer;
cad:String;
begin
while not do
begin
end;
/***********************************/


la idea es Tinserts.Execute, reciba dos parametros.

escafandra
15-01-2011, 10:23:32
Quizás la forma mas sencilla y clara sea definir esos parámetros como propiedades de la clase TThread que has creado. Al instanciarla, creas un Thread en modo suspendido (Suspended), colocas los valores apropiados y luego permites la ejecución (Resume).


Saludos.