Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
1-95906
msg
2002-08-16 08:56
2002.08.29
Как убрать с окна рамку 3х мерности


7-95992
Device
2002-06-16 03:37
2002.08.29
как вытащить серийник BIOS в NT ?


1-95798
Aszbed
2002-08-19 14:47
2002.08.29
Все равно не понял :о)


6-95929
BlackSun
2002-06-21 05:41
2002.08.29
Глюки с отправкой письма, помогите, плиз.


1-95767
Ura
2002-08-19 16:14
2002.08.29
_DCB структура COMM порта.





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