Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-10978
Wonder
2003-08-14 15:02
2003.09.04
По поводу той задачи, из-за которой драки назревают :)


14-10974
Marser
2003-08-18 01:18
2003.09.04
Именинники 18 августа


1-10783
Vorobyev Sergey
2003-08-21 08:33
2003.09.04
Как сохранить совместимость при передаче указат. на объект в DLL?


1-10767
duke2
2003-08-24 14:59
2003.09.04
Как извлечь из буфера обмена картинку ?


3-10552
Санек
2003-08-11 13:27
2003.09.04
Данные поля в Caption





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