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

Вниз

Потоки   Найти похожие ветки 

 
dnv-nik   (2003-08-22 10:41) [0]

Помогите, пожалуйста, разобраться с потоками.

По идее должно работать так – на форме (Form1) расположены 2 кнопки – START и STOP. При нажатии на кнопку START должен запускаться очередной (максимум 10) поток, который создает новую Tbutton и организует ее движение по форме. При нажатии на кнопку STOP должны быть «убиты» все потоки.
Однако, у меня запускается максимум 6 (шесть) потоков. А кнопкой STOP я не могу убить ни один поток – выдается ошибка доступа к памяти.
Ниже привожу чуть кастрированный текст программы.
Заранее благодарю всех тех, кто постарается помочь.

NIK.

Fond-ugol@mtu-net.ru

unit Unit1; //============================

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;

var
Form1: TForm1;
num : integer;
T1 : array [0..10] of TS_Thread; // Массив нитей

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin // Кнопка запуска очередного потока
if num > 10 then exit;
T1[num] := TS_Thread.Create;
Inc(num);
end;

procedure TForm1.Button2Click(Sender: TObject);
var i : integer;
begin // Убить все потоки
for i := 0 to num - 1 do
T1[i].Terminate;
end;
end.

unit Unit2; // =========================== Поток

uses
Classes, Graphics, ExtCtrls, stdctrls, Sysutils;

type
TS_Thread = class(TThread)
private
Bt : TButton;
protected
procedure DoWork;
procedure Execute; override;
public
constructor Create;
end;

implementation

uses Unit1;

constructor TS_Thread.Create;
begin
Bt := TButton.Create(Form1);
Bt.Parent := Form1;
Bt.Tag := 1;
Bt.Left := 10;
Bt.Caption := IntToStr(Integer(@Bt));
inherited Create(False);
Inc(num);
end;

procedure TS_Thread.Execute;
begin
while not Terminated do
Synchronize(DoWork); // Реализует перемещение кнопки по Form1
Bt.Free;
end;

procedure TS_Thread.DoWork;
begin // Реализует перемещение кнопки по Form1
if Bt.Left < 0 then
Bt.Tag := 1
else if (Bt.Left + Bt.Width) > Form1.Width then
Bt.Tag := -1;
Bt.Left := Bt.Left + Bt.Tag;
end;

end.


 
MVova ©   (2003-08-22 10:53) [1]

1. T1 : array [0..10] of TS_Thread; // Массив нитей
масив на 11 элементов

2. Inc(num);
в TForm1.Button1Click
и в TS_Thread.Create;

3. Надо или FreeOnTerminate установить в True? или делать free.


 
Внук ©   (2003-08-22 10:53) [2]

Код, конечно, ужасный, но если конкретно по теме - твоя ошибка в том, что ты для каждого потока дважды увеличиваешь num.

procedure TForm1.Button1Click(Sender: TObject);
begin // Кнопка запуска очередного потока
if num > 10 then exit;
T1[num] := TS_Thread.Create;
Inc(num);
end;

constructor TS_Thread.Create;
begin
Bt := TButton.Create(Form1);
Bt.Parent := Form1;
Bt.Tag := 1;
Bt.Left := 10;
Bt.Caption := IntToStr(Integer(@Bt));
inherited Create(False);
Inc(num);
end;


 
Внук ©   (2003-08-22 10:55) [3]

procedure TS_Thread.Execute;
begin
while not Terminated do Synchronize(DoWork);
Bt.Free;
end;

- классический пример того, как не надо писать функцию потока.



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

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

Наверх




Память: 0.47 MB
Время: 0.017 c
6-10865
AlexGof
2003-06-30 13:35
2003.09.04
как переименовать Attachments фай в NMPOP3 Fastnet


1-10755
Массиватор
2003-08-25 06:23
2003.09.04
Image Editor


11-10659
Igor_83
2002-12-29 19:44
2003.09.04
Help


14-10939
Skalp
2003-08-16 18:26
2003.09.04
Autorun у CD привода.


1-10812
JohnJ
2003-08-21 01:42
2003.09.04
Атрибуты файла