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

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

Как удалить объект из дочернего потока


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

Priest ©   (2006-10-18 14:38:00) 

Есть объект. Я хочу, чтобы определёныый момент он был удалён из дочернего потока. Если делать через Free, то получается что объект выпоняет свой метод и удаляется  в середине выполнения. Из-за этого возникают ошибки. Через PostMessage я тоже не могу, так как объект закончит свой метод, а потом удалится. А мне нужно имено в середине метода. Как осуществить сабж?


evvcom   (2006-10-19 10:09:00) [1]

Мрак.

> procedure TDefault.SameMethod;
> var
> CS:TPxCriticalSection;
> begin
> CS:=TPxCriticalSection.Create('Sec');
> CS.Enter();
> sleep(60000);
> writeln('Эту строку не увидишь ТЫ!')
> end;

1. Секцию создаешь и забываешь о ней? Нехай о ней ось заботится. Да... подходец!
2. Потом из секции создаешь поток, один. Так что этой секцией пытаешься защитить?
3. Насколько я понял ты секцие назвал то, что называется Event? Нафига людей путать?

Ты или начни с примеров попроще, прочитав соответствующую литературу, или забудь про программирование вовсе.


Сергей М.   (2006-10-19 10:07:00) [2]


> не лучше ли Event+WaitForSingleObject


Нет, не лучше.
Если уж тебе потребовался аналог КС с фозможностью ограничения времени ее ожидания, то здесь сам собой напрашивается Mutex + [Msg]WaitFor[Single | Multiple]Object[s]

Мюьтекс кр.всего прочего позволит потоку В захватить себя, если поток А, захватив этот мьютекс ранее, "умер" не удосужившись его "отпустить" перед "смертью" (см. WAIT_ABANDONED)


Priest   (2006-10-19 10:00:00) [3]

Таймер + TryEnterCriticalSection()

А не лучше ли Event+WaitForSingleObject. А таймер я прикрутил из-за безисходности. Так как в момент оповещения ком подписок, у меня происходит повисание на неопределённое время....Вот и происходят игры с бубном


Сергей М.   (2006-10-19 09:47:00) [4]


> мне нужно чтобы ждало определённое время


Таймер + TryEnterCriticalSection()


> я использовал эвент...  Но он не позволяет захватить его дважды из одного потока


О "захвате" можно вести речь только в случае мьютекса и крит.секции.
С некоторой натяжкой можно говорить о "захвате" и в случае с семафором.
Но "захват" ивента - это нонсенс.


Priest   (2006-10-19 09:25:00) [5]

>>i-am-vladko ©   (18.10.06 16:27) [32]
>>а это еще че?
>>if Thread.Suspended then
>>  Thread.Resume();
>>Thread.Terminate();

Попробуйте запустить такой код.

type
 TDefThread = class(TThread)
 public
   procedure Execute; override;
 end;

procedure TDefThread.Execute;
begin
while true do
begin
 sleep(100);
end;

end;

var
DT:TDefThread;
begin
DT:=TDefThread.Create(False);
DT.Suspend;
DT.Free;
Writeln('Выполнено');
end.

И сразу станет ясно зачем я в деструкторе запускаю остановленый поток. Но вместо Free вызывается Terminate. Т.к. в конструкторе у потока выставлено свойство FreeOnTerminate, то поток будет уничтожен при Terminate.


Priest   (2006-10-19 09:18:00) [6]

Пусик,  Сергей М.

Да знаю  я это. Проблема в том, что стандартная реализация секции предпологает ожидание критической секции в aquire бесконечно долго. А мне нужно чтобы ждало определённое время. Поэтому я использовал эвент. Он позволяет ожидать заданое время. Но он не позволяет захватить его дважды из одного потока. Поэтому я изменил стандартную реализацию


Сергей М.   (2006-10-19 08:27:00) [7]


> Priest ©   (18.10.06 16:52) [36]


Система ведет подсчет aquire/release каждой крит.секции.

Успешный "вход" потока в секцию (aquire) приводит к увеличению внутр.сч-ка на 1, "выход" потока из секции (realease) сопровождается соотв-но уменьшением сч-ка на 1.

Любой другой поток того же процесса не сможет осуществить "вход" в секцию до тех пор пока ее сч-к > 0, т.е. если поток А выполнил два aquire и всего один release перед тем как "умереть", ни один другой поток того же процесса не сможет с этого момента войти в секцию.


Пусик   (2006-10-18 17:50:00) [8]


> Priest ©   (18.10.06 16:44) [34]
> Ладно с самого начала. Мне нужна критическая секция, в которую
> можно было входить рекурсивно и при этом она ожидалась не
> вечно, а определеённое время. Для этого я ввёл класс TPxCriticalSection.
>


Один и тот же поток и так может входить в критическую секцию сколько угодно раз.
Для этого нет необходимости свой класс писать.


Priest   (2006-10-18 16:54:00) [9]

Я имею ввиду вход из одного потока в критическую секцию несколько раз типа

Enter
try
  Enter
  try
 
 finally
   Leave
  end
finally
 Leave
end


Что тут не так?


Priest   (2006-10-18 16:52:00) [10]

Почему ерунда? Вот у меня есть метод, часть вычислений выполняется в крит секции. В этой части вызывается другой метод, а в нём тоже вход в критич. секцию. Вы предлагаете везде проверять не вошли ли мы в секцию?
А смысл? Если внутрений метод может вызываться сам и ему нужна секция и внутри другого метода, где тоже нужна секция


Сергей М.   (2006-10-18 16:49:00) [11]


> Что тут не так?


Здесь всене так.
Начиная с "входить рекурсивно .. в критическую секцию", ибо это полная галиматья.


Priest   (2006-10-18 16:44:00) [12]

Ладно с самого начала. Мне нужна критическая секция, в которую можно было входить рекурсивно и при этом она ожидалась не вечно, а определеённое время. Для этого я ввёл класс TPxCriticalSection.

Что в классе не так?

При этом получается так, что некоторые потоки входят в критическую секцию, но уже не выходят за предельно допустимое время. Поэтому я запускаю дочерний поток, который "убивает" тот поток, который завладел секцией.

Что тут не так?


Priest   (2006-10-18 16:36:00) [13]

Нашёл я твою ветку
The GetCurrentThread function returns a pseudohandle for the current thread.
HANDLE GetCurrentThread(VOID)

А я юзаю
The GetCurrentThreadId function returns the thread identifier of the calling thread.
DWORD GetCurrentThreadId(VOID)

>>if Thread.Suspended then
 Thread.Resume();
Вот помощь
Terminate sets the thread’s Terminated property to true, signaling that the thread should be terminated as soon as possible.

For Terminate to work, the thread's Execute method and any methods that Execute calls should check Terminated periodically and exit when it's true.

Если поток остановлен, то его метод Execute не будет выполняться и следовательно, негде проверять флаг Terminated


i-am-vladko   (2006-10-18 16:27:00) [14]

а это еще че?
if Thread.Suspended then
  Thread.Resume();
Thread.Terminate();


Priest   (2006-10-18 16:27:00) [15]

>>CurrThread := GetCurrentThreadId();
А ссылку можно.


Сергей М.   (2006-10-18 16:26:00) [16]


> Priest


Галиматьища полная.

ты где этот код содрал ?)


i-am-vladko   (2006-10-18 16:25:00) [17]

ДА ВОБЩЕМ
ВСЕ НЕ ТАК


Priest   (2006-10-18 16:25:00) [18]

Удалено модератором


i-am-vladko   (2006-10-18 16:24:00) [19]

CurrThread := GetCurrentThreadId();
- это мне недавно проясняли  ))) посмотри на форуме


Priest   (2006-10-18 16:23:00) [20]

Что не так? ТАм где виснет я написал sleep


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

Наверх

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