Главная страница
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.018 c
1-10725
MetalFan
2003-08-19 15:39
2003.09.04
Нарисовать стрелки...


3-10616
stud
2003-08-13 12:08
2003.09.04
права доступа к базе


14-10919
Marser
2003-08-19 00:27
2003.09.04
Именинники 19 августа


1-10747
ru_efim
2003-08-19 23:04
2003.09.04
Генерация отчета в HTML формате.


14-10932
iusupp
2003-08-13 01:19
2003.09.04
Помогите ... Есть два вопроса...