Главная страница
    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.033 c
1-1088243399
DillerXX
2004-06-26 13:49
2004.07.11
Что-то у меня не работает BinToHex


4-1086092265
Андрей Сенченко
2004-06-01 16:17
2004.07.11
К вопросу по ALT-F4 и прочем


1-1088246582
X9
2004-06-26 14:43
2004.07.11
CM_MOUSEENTER, CM_MOUSELEAVE и TSpeedButton


14-1087546150
Kerk
2004-06-18 12:09
2004.07.11
"Полный апгрейд"


14-1087932464
Sergey Masloff
2004-06-22 23:27
2004.07.11
Holy War! AMD vs INTEL $-)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский