Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.14;
Скачать: CL | DM;

Вниз

обратиться к потоку в рантайм   Найти похожие ветки 

 
stud ©   (2005-07-22 11:38) [0]

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


 
GLFox ©   (2005-07-22 11:41) [1]

Поток может проверять сам какие-либо данные. А шоб не было конфликта юзай CriticalSection


 
evvcom ©   (2005-07-22 11:48) [2]


> с компанентами проще можно по findcomponent

Можно, но не нужно. А нужно в переменных объекты запоминать. Тогда и проблем меньше будет.
А вообще API функция какая-то есть для этих целей. Не помню, какая. Сейчас кто-нить подскажет.


 
stud ©   (2005-07-22 12:02) [3]


> А нужно в переменных объекты запоминать

это как?


 
Alexander Panov ©   (2005-07-22 12:09) [4]


TMyThread=class(TThread)
private
  FCode: Integer;
  ...
public
  ...
  property Code: Integer read FCode;
end;

MyThread := TMyThread.Create();

ShowMessage(IntToStr(MyThread.Code));


 
stud ©   (2005-07-22 12:14) [5]

а если потоков несколько?
и они динамически содаются
каким образом например можно изменить Fcode?


 
stud ©   (2005-07-22 12:16) [6]

у меня такой код, в цикле несколько штук создается (насколько это правильно или не правильно сейчас не важно) как изменить св-ва любого из них?
with TMonDirThread.Create(false) do
   begin
     name:="thread"+inttostr(i);      DirPath:=settingfile.ReadString(sectionini.Strings[i],"f_dir","..");
     outgrid:=(form1.FindComponent("stringgrid"+inttostr(i)) as Tstringgrid);      file_mask:=settingfile.ReadString(sectionini.Strings[i],"fmask","*.log");      key_fraze:=settingfile.ReadString(sectionini.Strings[i],"r_key","");
   end;


 
Alexander Panov ©   (2005-07-22 12:23) [7]

stud ©   (22.07.05 12:14) [5]

Ну все сразу тебе расскажи...

stud ©   (22.07.05 12:14) [5]
а если потоков несколько?
и они динамически содаются


Хранишь список потоков, иначе - никак.
Например - TList, TObjectList, array of TMayThread и т.п.

Для изменения и чтения и спользуй критические секции (см. TCriticalSection).

примерно это выглядит так:

TMyThread=class(TThread)
private
  FCode: Integer;
  FCS: TCriticalSection;
  ...
  function GetCode: Integer;
  procedure SetCode(Value: Integer);
public
  constructor Create(...);
  destructor
  ...
  property Code: Integer read GetCode write SetCode;
end;

constructor TMyThread.Create(...)
begin
  ...
  FCS := TCriticalSection.Create;
end;

destructor TMyThread.Destroy(...)
begin
  ...
  FCS.Free;
  inherited;
end;

function TMyThread.GetCode: Integer;
begin
  FCS.Enter;
  Result := FCode;
  FCS.Leave;
end;

procedure TMyThread.SetCode(Value: Integer);
begin
  FCS.Enter;
  FCode := Value;
  FCS.Leave;
end;

MyThread := TMyThread.Create();

ShowMessage(IntToStr(MyThread.Code));


 
TUser ©   (2005-07-22 12:45) [8]

Для отслеживания изменений в конкретном каталоге существуют специальные api-функции. Доп. поток обычно не нужен.


 
Digitman ©   (2005-07-22 12:51) [9]


> обратиться к потоку в рантайм


поток (в дан.случае - объект класса-наследника TThread) в этом плане НИЧЕМ не отличается от любого иного объекта (наследника TObject)


 
Fay ©   (2005-07-22 13:09) [10]

2 stud ©   (22.07.05 11:38)
Бредятина какая-то. К тому же не понятно, для чего сделано уточнение "в рантайм"? Типа в design-time проблема решена, осталось только разобраться с run-time. 8)

>> с компанентами проще можно по findcomponent
Зачем искать? Никто ведь не ищет, извините, попу приходя в туалет! Где искать? Я (к примеру) не брал. Может быть это Digitman спрятал, а теперь в несознанку ударился?


 
Digitman ©   (2005-07-22 13:15) [11]


> Fay ©   (22.07.05 13:09) [10]


не-а, не прятал ..

"- Шпака брал ?
- Казань брал, Киев брал ... Шпака ... не брал .." (с)


 
stud ©   (2005-07-22 13:35) [12]


> Fay ©   (22.07.05 13:09) [10]

весьма содержательный пост

> для чего сделано уточнение "в рантайм"?

это настолько принципиально????

> Никто ведь не ищет, извините, попу приходя в туалет!

так попа не всегда нужна


 
stud ©   (2005-07-22 13:36) [13]


> TUser ©   (22.07.05 12:45) [8][Ответить]

а можно подробнее? где их искать?


 
Fay ©   (2005-07-22 13:38) [14]

2 stud ©   (22.07.05 13:35) [12]

Ладно, будем по шагам.
Вам ответили "А нужно в переменных объекты запоминать", на что Вы среагировали "это как?".
По моему, этого достаточно для прописки в орешнике - Вы действительно не знаете как?


 
Alexander Panov ©   (2005-07-22 13:43) [15]

TUser ©   (22.07.05 12:45) [8]
Для отслеживания изменений в конкретном каталоге существуют специальные api-функции. Доп. поток обычно не нужен.


Где-то было упоминание об используемых средствах?
Потоки нужны для того, что бы выполняли свою функцию.


 
stud ©   (2005-07-22 13:47) [16]


> Fay ©   (22.07.05 13:38) [14]

это я знаю, но как это применить в моем случае?
сколько нужно переменных заранее не известно

> Alexander Panov ©   (22.07.05 12:23) [7][Ответить]
>Хранишь список потоков, иначе - никак.
> Например - TList, TObjectList, array of TMayThread и
> т.п.

вот это уже понятно


 
Digitman ©   (2005-07-22 13:52) [17]


> это настолько принципиально?


ну ты же упомянул)
значит, для тебя это принципиально ?
или всуе упомянул ?)


> попа не всегда нужна


она нужна там где нужна
и в сортире, думаю, нужна в первую очередь

иначе, согласись, глупо как-то получается - бамажка есть, заготовил с вечера еще, а задницу сейчас попытаемся найти, если получится)

а теперь - по сабжу..

выполнив
with TMonDirThread.Create(false) do
ты создал объект (по колено - поток там или не поток ! .. просто некий объект) и нигде не зафиксировал ссылку на него, тем самым фактически потеряв его в памяти

а чтобы обратиться к ранее созданному объекту нужно знать, где он в памяти находится ..

куда уж проще было при создании объекта тут же запомнить его адрес, хотя бы так :

var MonDirThread: TMonDirThread;
..
MonDirThread := TMonDirThread.Create(false);
with MonDirThread do ..


 
stud ©   (2005-07-22 14:00) [18]

т.е. в моем случае примерно так?
var
thread_ar : array of TMonDirThread;

thread_ar[i]:=TMonDirThread.Create(false);
with thread_ar[i] do
begin


 
Digitman ©   (2005-07-22 14:01) [19]

можно и так ... криминала в том нет ..


 
evvcom ©   (2005-07-22 16:37) [20]


> stud ©   (22.07.05 14:00) [18]

Только не забудь SetLength сделать, а то сейчас еще на 20 постов вопросов будет типа "А почему у меня Range checking error выскакивает?" да "Access Violation".



Страницы: 1 вся ветка

Текущий архив: 2005.08.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.027 c
9-1114359194
Yegorchic
2005-04-24 20:13
2005.08.14
Как сделать 2D вид в GLScene?


9-1114275258
Comrade
2005-04-23 20:54
2005.08.14
В продожении темы "Как "забобахать" мегопростую игр"


1-1122362108
Frozzen
2005-07-26 11:15
2005.08.14
Поясните плиз объявление структуры:


4-1119348127
clickmaker
2005-06-21 14:02
2005.08.14
Как программно узнать, что диск - subst?


3-1120464571
ANB
2005-07-04 12:09
2005.08.14
Как определить, что выполнение оператора SQL закончилось (Oracle)