Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как треду перед запуском передать/установить параметры/флаги?


Страницы:   1 2 3

Olorin ©   (2002-08-15 11:44:00) 

Вот и вопрос собственно!


Olorin   (2002-08-16 14:22:00) [21]

Нет его в доступных функциях, методах, параметрах... он вообще не виден! :o)


Digitman   (2002-08-16 14:16:00) [22]

>Olorin

Что значит "флаг недоступен" ? Поясни.


Olorin   (2002-08-16 13:14:00) [23]

Хм ну вот... подкинули НЕрабочий пример... в общем то идея даже не рабочая... так как я таким же способом хотел параметры передавать ан нет не вышло... не ужели никто не поможет из Мастеров? :o)


Olorin   (2002-08-16 12:16:00) [24]

//где-то далее по тексту, пока код.поток работает еще,
//меняем состояние флага, управляя тем самым ходом выполнения
//метода Execute()
...
MouseStart1.MyFlag := True;
...
MouseStart1.MyFlag := False;

Этот флаг не доступен! Не понял почему.... :o(


Digitman   (2002-08-16 11:20:00) [25]

ну, вот, скажем, самый простой вариант :

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 10:48:00) [26]

Вопрос в том как его создать... если определить в классе TbtnMouseStart то этот флаг не будет виден и его нельзя будет использовать, хм взводить его при запуске процесса... а как потом его менять из основного кода??
Я выше написал то что у меня сейчас есть... тот пример который вы постили ДО этого вверг меня в непонятки... может вы сможете мне на готовом(тот что я привел) объяснить?


Digitman   (2002-08-16 10:41:00) [27]

А какое поле класса TbtnMouseStart у тебя есть некий флаг ?
Что-то не вижу я, где и какой флаг взводится : ни в процедуре btnMouseStartClick() ни в методе-конструкторе TbtnMouseStart.Create()

Что ты подразумеваешь под понятием "флаг" ? Флаг имеет два состояния - установлен (или взведен, или "1", или TRUE - как угодно) и сброшен ("0", FALSE и т.д.) ... Т.е. флаг - логическое понятие и, соответственно, логический тип данных в коде. У тебя нет ни одного логического поля в классе TbtnMouseStart. Что проверять-то ?



Olorin   (2002-08-16 10:23:00) [28]

>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(


Olorin   (2002-08-16 08:39:00) [29]

Я имелл виду разницу с просто создание глобальных переменных... ок так получается красивей... :o)


Digitman   (2002-08-16 08:36:00) [30]

>Olorin

А что здесь ресурсоемкого ? Ты просто обращаешься к некоему полю/свойству некоего класса, устанавливая его значение нужным тебе образом.


Olorin   (2002-08-16 08:26:00) [31]

Хм примерно понял идею... попробую реализовать... тут еще вопрос... не будет ли этот способ ресурсоемким :o)


Digitman   (2002-08-16 08:04:00) [32]

>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 06:51:00) [33]

>panov ©
Да в общем все уже конкретно описанно выше...
Я запускаю из своего процесса потоки могу штук 20 за раз могу по одному... иак как у них нет завершения по коду я должен их останавливать сам... типа скажем установил глобальную переменную fDone в True и процесс остановился... НО держать 20 и более глобальных переменных IMHO чудовищно... вот и спрашиваю может есть другие пути??


Olorin   (2002-08-16 06:48:00) [34]

>Digitman ©
В общем так но что вы имели ввиду под фразой:
"фиксируя ссылки на них где-то в отдельных переменных или в массиве."????


Digitman   (2002-08-15 15:48:00) [35]

так, стоп.

Нет понятия "задача", ушло оно вместе в небытие. Есть "процесс" - ОС-объект, создаваемый системой как реакция на старт приложения.

В контексте процесса существует как минимум один кодовый поток - основной. В контексте осн.код.потока процесса ты создаешь N дополнительных, фиксируя ссылки на них где-то в отдельных переменных или в массиве. И хочешь в произвольный момент времени в контексте осн.код.потока взвести некий флаг, в результате чего соответствующий этому флагу некий доп.код.поток из созданных тобой и работающих в дан.момент времени был приостановлен на время.

Так или не так ?


panov   (2002-08-15 15:43:00) [36]

Ты бы написал, что ты получить хочешь.
Может и флаги не понадобятся.


Olorin   (2002-08-15 15:37:00) [37]

>Ученик ©
Упс сорри я не внимателен... ок я просто не понял как организовать список тредов на которые указывает глобальная переменная :o/


Olorin   (2002-08-15 15:36:00) [38]

>Digitman ©
Задача запускает потоки много либо по одному либо несколько сразу... так вто не удобно создавать 10-15 глобальных переменных чтобы рулить остановкой процессов :o(


Digitman   (2002-08-15 15:33:00) [39]

Кто должен взводить этот флаг ? Другой поток ?


Ученик   (2002-08-15 15:32:00) [40]

>Olorin © (15.08.02 15:26)
Ученик © (15.08.02 14:16)
threadvar там уже не было


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо