Форум: "Основная";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];
Вниз
Как треду перед запуском передать/установить параметры/флаги? Найти похожие ветки
← →
Olorin (2002-08-15 11:44) [0]Вот и вопрос собственно!
← →
Skier (2002-08-15 11:53) [1]>Olorin
создать свой конструктор с параметрами, которые необходимы.
← →
Olorin (2002-08-15 12:15) [2]Скиер можно поподробнее.... скажем я создаю тип:
type
TbtnMouseStart = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
.........................
var
MouseStart1: TbtnMouseStart;
MouseStart2: TbtnMouseStart;
Как каждому потоку передать свои параметры?
← →
Skier (2002-08-15 12:23) [3]>Olorin
TbtnMouseStart = class(TThread)
private
FYourParam1 : Integer;
FYourParam2 : String;
protected
procedure Execute; override;
public
constructor CreateWithParams(CreateSuspended: Boolean;
const AYourParam1 : Integer; const AYourParam2 : String);
end; //TbtnMouseStart
{ TbtnMouseStart }
constructor TbtnMouseStart.CreateWithParams(CreateSuspended: Boolean; const AYourParam1: Integer; const AYourParam2: String);
begin
inherited Create(CreateSuspended);
FYourParam1 := AYourParam1;
FYourParam2 := AYourParam2;
end;
procedure TbtnMouseStart.Execute;
begin
inherited Execute;
end;
Создание :
var
MouseStart1: TbtnMouseStart;
MouseStart2: TbtnMouseStart;
begin
MouseStart1 := TbtnMouseStart.CreateWithParams(False, 0, "This
is my own parameter");
MouseStart2 := TbtnMouseStart.CreateWithParams(False, 0, "This
is my own parameter too");
//............
end;
← →
Ученик (2002-08-15 12:26) [4]>Skier © (15.08.02 12:23)
Извиняюсь, чуть поправлю
constructor TbtnMouseStart.CreateWithParams(CreateSuspended: Boolean; const AYourParam1: Integer; const AYourParam2: String);
begin
FYourParam1 := AYourParam1;
FYourParam2 := AYourParam2;
inherited Create(CreateSuspended);
end;
← →
Skier (2002-08-15 12:27) [5]>Ученик
Валяй...:)))
← →
Skier (2002-08-15 12:30) [6]>Ученик
Я тут подумал - если создавать Thread с параметром
CreateSuspended = False, то твоя поправка очень существенна...Приступ невнимательности... :)
← →
Olorin (2002-08-15 12:37) [7]Ок огромное спасибо пока разобирался с примером из дельфи вы тут разжевали... уряяя..... а еще вопрос... если у меня может запускаться МНОГО потоков неужели на каждый создавать переменную флаг?
← →
Skier (2002-08-15 12:40) [8]>Olorin
Если флаг для каждого потока должен быть свой, то да...
← →
Ученик (2002-08-15 12:50) [9]>Olorin © (15.08.02 12:37)
Есть еще threadvar
← →
Olorin (2002-08-15 13:00) [10]>Ученик ©
Хм и чем отличается применение threadvar от просто глобальной??
>Skier ©
Угу флаг нужен различный для каждого треда...
← →
Ученик (2002-08-15 13:02) [11]>Olorin © (15.08.02 13:00)
Для каждого треда она своя
← →
Olorin (2002-08-15 13:39) [12]Хм тоесть я ее могу перед стартом в задаче иннициализировать и потом проверять ее значение при работе из потока?
Чего то я не допер... может пример... на пару строк? :o)
← →
Ученик (2002-08-15 13:45) [13]Source\Internet\Sockets.pas
ThreadObject: TClientSocketThread;
← →
Olorin (2002-08-15 13:53) [14]>Ученик ©
Хм не понял как оно пашет:
implementation
threadvar
ThreadObject: TClientSocketThread;
Мне же для каждого запускаемого треда нужен свой экземпляр... тоесть писать из задачи и читать из процессов... тоесть просто останавливать процессы по флагу не все, а только те которым укажу...
← →
Ученик (2002-08-15 14:16) [15]Флаг можно организовать как список тредов (глобальная переменная), которым нужно выполнить задание, треды проверяют наличие себя в списке
← →
Olorin (2002-08-15 14:24) [16]А подробнее сильно много писать? :o)
← →
Ученик (2002-08-15 14:39) [17]>Olorin © (15.08.02 14:24)
Подробнее прийдется мастеров ждать :)))
← →
Olorin (2002-08-15 14:52) [18]>Ученик ©
Эхх пока они прийдут топ улетит в дальние дали :o(
← →
Ученик (2002-08-15 15:01) [19]>Olorin © (15.08.02 14:52)
Какая часть реализации вызывает вопросы ?
← →
Olorin (2002-08-15 15:26) [20]>Ученик ©
Именно как использовать threadvar как флаг остановки потоков... не всех сразу а только того что нужно...
← →
Ученик (2002-08-15 15:32) [21]>Olorin © (15.08.02 15:26)
Ученик © (15.08.02 14:16)
threadvar там уже не было
← →
Digitman (2002-08-15 15:33) [22]Кто должен взводить этот флаг ? Другой поток ?
← →
Olorin (2002-08-15 15:36) [23]>Digitman ©
Задача запускает потоки много либо по одному либо несколько сразу... так вто не удобно создавать 10-15 глобальных переменных чтобы рулить остановкой процессов :o(
← →
Olorin (2002-08-15 15:37) [24]>Ученик ©
Упс сорри я не внимателен... ок я просто не понял как организовать список тредов на которые указывает глобальная переменная :o/
← →
panov (2002-08-15 15:43) [25]Ты бы написал, что ты получить хочешь.
Может и флаги не понадобятся.
← →
Digitman (2002-08-15 15:48) [26]так, стоп.
Нет понятия "задача", ушло оно вместе в небытие. Есть "процесс" - ОС-объект, создаваемый системой как реакция на старт приложения.
В контексте процесса существует как минимум один кодовый поток - основной. В контексте осн.код.потока процесса ты создаешь N дополнительных, фиксируя ссылки на них где-то в отдельных переменных или в массиве. И хочешь в произвольный момент времени в контексте осн.код.потока взвести некий флаг, в результате чего соответствующий этому флагу некий доп.код.поток из созданных тобой и работающих в дан.момент времени был приостановлен на время.
Так или не так ?
← →
Olorin (2002-08-16 06:48) [27]>Digitman ©
В общем так но что вы имели ввиду под фразой:
"фиксируя ссылки на них где-то в отдельных переменных или в массиве."????
← →
Olorin (2002-08-16 06:51) [28]>panov ©
Да в общем все уже конкретно описанно выше...
Я запускаю из своего процесса потоки могу штук 20 за раз могу по одному... иак как у них нет завершения по коду я должен их останавливать сам... типа скажем установил глобальную переменную fDone в True и процесс остановился... НО держать 20 и более глобальных переменных IMHO чудовищно... вот и спрашиваю может есть другие пути??
← →
Digitman (2002-08-16 08:04) [29]>Olorin
Самые обычные действия имел ввиду :
var
MyThread1, MyThread2: TMyThread;
MyThreads: array[..] of TMyThread;
...
// фиксация ссылки в именованой переменной
MyThread1 := TMyThread.Create(..);
MyThread2 := TMyThread.Create(..);
//взведение флага, индивидуального для соответствующего
//кодового потока,
//ссылка на который хранится в именованой переменной
MyThread1.SomeFlag := True;
MyThread2.SomeFlag := True;
//////////////////////////////////////////////
// фиксация ссылки в элементе массива
MyThreads[i] := TMyThread.Create(..);
//взведение флага, индивидуального для i-го кодового потока
MyThreads[i].SomeFlag := True;
← →
Olorin (2002-08-16 08:26) [30]Хм примерно понял идею... попробую реализовать... тут еще вопрос... не будет ли этот способ ресурсоемким :o)
← →
Digitman (2002-08-16 08:36) [31]>Olorin
А что здесь ресурсоемкого ? Ты просто обращаешься к некоему полю/свойству некоего класса, устанавливая его значение нужным тебе образом.
← →
Olorin (2002-08-16 08:39) [32]Я имелл виду разницу с просто создание глобальных переменных... ок так получается красивей... :o)
← →
Olorin (2002-08-16 10:23) [33]>Digitman ©
Хм немного не понял... вот кусок кода:
unit uothreads;
interface
uses
Classes, Windows, Messages;
type
TClickType = (MDOUBLE, MSINGLE);
TButtonType = (MLEFT, MRIGHT);
TbtnMouseStart = class(TThread)
private
FClickType: TClickType;
FButtonType: TButtonType;
FIterval: Integer;
FProcHWND: HWND;
FX: Integer;
FY: Integer;
protected
procedure Execute; override;
public
constructor Create(Sender: TObject; AClickType: TClickType; AButtonType: TButtonType; AIterval: Integer; AProcHWND: HWND; AX: Integer; AY: Integer);
end;
implementation
constructor TbtnMouseStart.Create(Sender: TObject; AClickType: TClickType; AButtonType: TButtonType; AIterval: Integer; AProcHWND: HWND; AX: Integer; AY: Integer);
begin
FClickType := AClickType;
FButtonType := AButtonType;
FIterval := AIterval;
FProcHWND := AProcHWND;
FX := AX;
FY := AY;
FreeOnTerminate := True;
inherited Create(False);
end;
procedure TbtnMouseStart.Execute;
begin
// какой-то код
end;
end.
Далее в основном юните:
procedure TfrmMain.btnMouseStartClick(Sender: TObject);
var
MouseStart1: TbtnMouseStart;
ThreadsTerminated: array[..] of TbtnMouseStart; //массив!?
AComboBox : TComboBox;
AEdit : TEdit;
AIndex : String;
begin
// запуск потока
MouseStart1 := TbtnMouseStart.Create(Sender, MDOUBLE, MLEFT, 1000, ProcHWND, 0, 0);
и далее ниччего не понимаю... как проверять состояние флага в процедуре Execute самого потока и что делать при запуске оного... :o(
← →
Digitman (2002-08-16 10:41) [34]А какое поле класса TbtnMouseStart у тебя есть некий флаг ?
Что-то не вижу я, где и какой флаг взводится : ни в процедуре btnMouseStartClick() ни в методе-конструкторе TbtnMouseStart.Create()
Что ты подразумеваешь под понятием "флаг" ? Флаг имеет два состояния - установлен (или взведен, или "1", или TRUE - как угодно) и сброшен ("0", FALSE и т.д.) ... Т.е. флаг - логическое понятие и, соответственно, логический тип данных в коде. У тебя нет ни одного логического поля в классе TbtnMouseStart. Что проверять-то ?
← →
Olorin (2002-08-16 10:48) [35]Вопрос в том как его создать... если определить в классе TbtnMouseStart то этот флаг не будет виден и его нельзя будет использовать, хм взводить его при запуске процесса... а как потом его менять из основного кода??
Я выше написал то что у меня сейчас есть... тот пример который вы постили ДО этого вверг меня в непонятки... может вы сможете мне на готовом(тот что я привел) объяснить?
← →
Digitman (2002-08-16 11:20) [36]ну, вот, скажем, самый простой вариант :
TbtnMouseStart = class(TThread)
public
MyFlag: Boolean;
constructor Create(...; MyFlagInitialState: Boolean);
end;
constructor TbtnMouseStart.Create(...; MyFlagInitialState: Boolean);
begin
...
MyFlag:= MyFlagInitialState;
inherited Create(False);
end;
procedure TbtnMouseStart.Execute;
begin
...
if MyFlag then...
else ...
...
end;
procedure TfrmMain.btnMouseStartClick(Sender: TObject);
var
...
begin
...
// создаем код.поток с изначально сброшенным флагом
MouseStart1 := TbtnMouseStart.Create(..., False);
...
end;
...
//где-то далее по тексту, пока код.поток работает еще,
//меняем состояние флага, управляя тем самым ходом выполнения
//метода Execute()
...
MouseStart1.MyFlag := True;
...
MouseStart1.MyFlag := False;
...
и т.д. ....
← →
Olorin (2002-08-16 12:16) [37]//где-то далее по тексту, пока код.поток работает еще,
//меняем состояние флага, управляя тем самым ходом выполнения
//метода Execute()
...
MouseStart1.MyFlag := True;
...
MouseStart1.MyFlag := False;
Этот флаг не доступен! Не понял почему.... :o(
← →
Olorin (2002-08-16 13:14) [38]Хм ну вот... подкинули НЕрабочий пример... в общем то идея даже не рабочая... так как я таким же способом хотел параметры передавать ан нет не вышло... не ужели никто не поможет из Мастеров? :o)
← →
Digitman (2002-08-16 14:16) [39]>Olorin
Что значит "флаг недоступен" ? Поясни.
← →
Olorin (2002-08-16 14:22) [40]Нет его в доступных функциях, методах, параметрах... он вообще не виден! :o)
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.29;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.008 c