Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.031 c
14-1087813143
SoftX
2004-06-21 14:19
2004.07.11
А не перестроить нам картину мира?


4-1084886158
zoom
2004-05-18 17:15
2004.07.11
Открыть определённый CD-rom


1-1088292852
Suomi
2004-06-27 03:34
2004.07.11
Инсталляция компонентов


3-1086685053
serg128
2004-06-08 12:57
2004.07.11
Как динамически добавить поле типа Lookup в TClientDataSet?


1-1088495676
Axelrodm
2004-06-29 11:54
2004.07.11
инсталляция vcl.editors4





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский