![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать поток в run-time?
{beginner} © (2004-06-26 17:43:00)...когда заранее количество потоков не известно.
До этого я делал, создавая новый модуль, через меню file/new.
Заранее благодарен!
Mim1 (2004-06-26 22:53:00) [1]
> > pb := pByte(p);
А, ну да, или
> pb := p; (p - это нетипизированый указатель и кастовать его в данном случае не требуется)
или
> procedure ThreadFunc(pb: pbyte) stdcall;
> и dispose(pb) очистит память выделенную под p?
Диспозе прибьет выделеный байтик памяти.
{beginner} (2004-06-26 22:12:00) [2]
> 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 21:42:00) [3]После выхода из
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 21:37:00) [4]Пытался сделать так:
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:33:00) [5]
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:00) [6]
> [8] Rouse_ © (26.06.04 21:32)
:)
Rouse_ (2004-06-26 21:32:00) [7]
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
);
{beginner} (2004-06-26 21:21:00) [8]Правда я к этому времени уже разобрался и сам, только остается одна проблема, как передавать параметр функции InstallThead?
{beginner} (2004-06-26 21:20:00) [9]
> Mim1 © (26.06.04 21:00) [5]
Да, спасибо, меня интересует именно API.
Mim1 (2004-06-26 21:00:00) [10]А вот 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;
Rouse_ (2004-06-26 20:18:00) [11]
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.
{beginner} (2004-06-26 19:09:00) [12]В общем, интересуют функции по работе с потоками (создание, остановка, уничтожение). И как ими пользоваться. Может подскажете статью, с примерами.
{beginner} (2004-06-26 18:19:00) [13]почему?
default (2004-06-26 17:44:00) [14]клиника