Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Как создать поток в run-time?   Найти похожие ветки 

 
{beginner}   (2004-06-26 17:43) [0]

...когда заранее количество потоков не известно.
До этого я делал, создавая новый модуль, через меню file/new.
Заранее благодарен!


 
default ©   (2004-06-26 17:44) [1]

клиника


 
{beginner}   (2004-06-26 18:19) [2]

почему?


 
{beginner}   (2004-06-26 19:09) [3]

В общем, интересуют функции по работе с потоками (создание, остановка, уничтожение). И как ими пользоваться. Может подскажете статью, с примерами.


 
Rouse_ ©   (2004-06-26 20:18) [4]

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TMySuperCoolThread = class(TThread)
 private
   I: Cardinal;
   procedure Sin;
 public
   procedure Execute; override;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   T: TMySuperCoolThread;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TMySuperCoolThread }

procedure TMySuperCoolThread.Execute;
begin
 inherited;
 I := 0;
 while not Terminated do
 begin
   Inc(I);
   Synchronize(Sin);
 end;
end;

procedure TMySuperCoolThread.Sin;
begin
 Form1.Caption := IntToStr(I);
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 T := TMySuperCoolThread.Create(True);
 T.Priority := tpIdle;
 T.FreeOnTerminate := True;
 T.Resume;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 T.Terminate;
end;

end.


 
Mim1 ©   (2004-06-26 21:00) [5]

А вот API

function InstallThead(Parameter: Pointer): Integer; stdcall;
begin
// some
end;

procedure TForm1.Button1Click(Sender: TObject);
var thid:dword;
   hInstallThead : thandle;
begin
 hInstallThead := CreateThread(nil,0,@InstallThead,nil,CREATE_SUSPENDED,thid);
 SetThreadPriority(hInstallThead,THREAD_PRIORITY_ABOVE_NORMAL);
 ResumeThread(hInstallThead);
end;


 
{beginner}   (2004-06-26 21:20) [6]


> Mim1 ©   (26.06.04 21:00) [5]


Да, спасибо, меня интересует именно API.


 
{beginner}   (2004-06-26 21:21) [7]

Правда я к этому времени уже разобрался и сам, только остается одна проблема, как передавать параметр функции InstallThead?


 
Rouse_ ©   (2004-06-26 21:32) [8]

HANDLE CreateThread(
 LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
 DWORD dwStackSize,                        // initial stack size
 LPTHREAD_START_ROUTINE lpStartAddress,    // thread function
 LPVOID lpParameter,                       // thread argument
 DWORD dwCreationFlags,                    // creation option
 LPDWORD lpThreadId                        // thread identifier
);


 
Mim1 ©   (2004-06-26 21:33) [9]

HANDLE CreateThread(

   LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes  
   DWORD dwStackSize, // initial thread stack size, in bytes
   LPTHREAD_START_ROUTINE lpStartAddress, // pointer to thread function
   LPVOID lpParameter, // argument for new thread    
 DWORD dwCreationFlags, // creation flags
   LPDWORD lpThreadId  // pointer to returned thread identifier
  );


> function InstallThead(Parameter: Pointer): Integer; stdcall;
> begin
> // some
> end;


 
Mim1 ©   (2004-06-26 21:33) [10]


> [8] Rouse_ ©   (26.06.04 21:32)


:)


 
{beginner}   (2004-06-26 21:37) [11]

Пытался сделать так:


type
pByte = ^Byte;

implementation

{$R *.dfm}

procedure ThreadFunc(p: pointer) stdcall;
var
pb: pByte;
b: Byte;

begin

pb := pByte(p);
b := pb^;       // Почему b тут <> 77?

end;

function NewThread: THandle;
var
b: Byte;
p: Pointer;

begin
b := 77;
p := @b;

Result := CreateThread(nil,0,@ThreadFunc,p,0,ID);
end;


 
Mim1 ©   (2004-06-26 21:42) [12]

После выхода из
function NewThread: THandle;
переменная > var > b: Byte; уничтодается
правильно
var p:pbyte ;
begin
 new(p);
 p^ := 77;
 Result := CreateThread(nil,0,@ThreadFunc,p,0,ID);
end;

procedure ThreadFunc(p: pointer) stdcall;
var
pb: pByte;
b:byte;
begin

b := pb^;
dispose(pb);
end;


 
{beginner}   (2004-06-26 22:12) [13]


> Mim1 ©   (26.06.04 21:42) [12]

Понял, спасибо.


> procedure ThreadFunc(p: pointer) stdcall;
> var
> pb: pByte;
> b:byte;
> begin
>   pb := pByte(p);
> b := pb^;
> dispose(pb);
> end;

и dispose(pb) очистит память выделенную под p?


 
Mim1 ©   (2004-06-26 22:53) [14]


> >   pb := pByte(p);

А, ну да, или
>   pb := p; (p - это нетипизированый указатель и кастовать его в данном случае не требуется)
или

> procedure ThreadFunc(pb: pbyte) stdcall;



> и dispose(pb) очистит память выделенную под p?

Диспозе прибьет выделеный байтик памяти.



Страницы: 1 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.049 c
14-1087502053
lak
2004-06-17 23:54
2004.07.11
клава с японским


1-1088198532
jktu
2004-06-26 01:22
2004.07.11
Вопрос о формуле


4-1085929941
Jel
2004-05-30 19:12
2004.07.11
LoadLibraryEx и FreeLibrary


4-1085915725
Seldon
2004-05-30 15:15
2004.07.11
Как завершить Explorer.exe?


3-1086933832
coldplayer
2004-06-11 10:03
2004.07.11
RXDBGrid + ADO. Проблема сортировки.