Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизКак создать поток в 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c