Форум: "Основная";
Текущий архив: 2003.09.04;
Скачать: [xml.tar.bz2];
ВнизПотоки Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c