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

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

TThread: Как создать свой объект-сигнализатор? [D5]


Страницы:   1 2

lipskiy ©   (2002-03-20 21:46:00) 

Народ! Никак не могу сообразить, как это делается.
Есть у меня поток, который обновляет данные через инет.
Создаю его, произвожу некоторую инициализацию, затем запускаю DialUp. И мне нужно подождать установки соединения. Компонент DialUp имеет событие OnConnect - при появлении этого события мне нужно продолжить выполнение потока.
Понятно, что нужно использовать WaitForSingleObject, но ему нужен Handle, а где мне его взять? То есть как получить Handle события OnConnect, что-ли... Запутался совсем.
Если можно ответить - то поподробнее, плз, первый раз с потоком вожусь.


lipskiy   (2002-03-21 18:21:00) [1]

2 Набережных С.
Логично. То есть если в списке процессов мой ехешник отстутствует, значит стопудово и потока тоже нет.
Это мне и надо было выяснить. Спасибо.


Набережных С.   (2002-03-21 18:03:00) [2]


> lipskiy © (21.03.02 17:23)

Выгрузить программу - означает освободить занимаемую ею память. Исполняемый код потока - часть кода программы, а код не может исполняться, если его нет в памяти. Если поток продолжает исполняться, то программа не выгружена.


panov   (2002-03-21 17:26:00) [3]

>Aleksandr © (21.03.02 15:40)
Нет, пока выполняется Sleep(2000), программа ресурсы не будет занимать.
>Набережных С. (21.03.02 17:16)
С другой стороны, создание и поддержка event - вполне конкретные затраты вполне конкретных ресурсов системы.
Создание и поддержка event - действительно использует ресурсы.
Но использование этих ресурсов не так важно, ка использование процессорного времени. Я бы даже сказал - это абсолютнонесопоставимые вещи.

>Aleksandr © (21.03.02 16:03)
Слушайте, может, я вам тогда весь код модуля приведу, а вы взглядами спецов скажите, где там топоры висят?

Не надо.

Если у тебя есть вопрос, то задавай его в отдельной ветке.


lipskiy   (2002-03-21 17:23:00) [4]

> А хелп открыть пробовал? ;)
Пробовал, не получается :)
А если серьезно - не знаю английского, поэтому всегда проблема с хелпами. Знание английского на уровне чтения операторов Паскаля позволяет только в общих чертах получить представление о предмете.

> "вышел из программы"
Ну выгрузил ее, как еще можно из нее выйти? Close сделал или Terminate, или есть разница, как завершать?
Просто однажды наблюдал, как один веник тоже тыкался наугад с потоками, сделал для потока свою форму отображения результатов, и когда завершил основную программу, то поточная форма осталась висеть и работать - данные какие-то продолжали обновляться. Причем запущено было из-под IDE, и она нормально завершила прогон программы, без ошибок и вопросов, а поток работал...
Убивал только через диспетчер задач.


Набережных С.   (2002-03-21 17:16:00) [5]


> Suntechnic © (21.03.02 15:38)

Все я прекрасно понимаю. Но дело-то в том, что в ДАННОМ случае эти затраты не имеют НИКАКОГО практического значения. И в любом случае syspend c resume закрывают тему.
С другой стороны, создание и поддержка event - вполне конкретные затраты вполне конкретных ресурсов системы. Но и эти расходы в ДАННОМ случае не имеют значения. И в ДАННОМ случае ни одно из решений не имеет реальных преимуществ перед остальными.

Слушай, давай просто закончим тему. Утомило. Извини, если чем-то задел, я не хотел.

lipskiy © (21.03.02 15:40)

> Под "работаешь" имеется ввиду только "пишешь" или вообще
> где она может быть запущена?

Где запущена.

> А то слышал, что он может остаться там висеть.

Не останется. Под NT все потоки на выходе будут закрыты, под 9х есть риск зависнуть.
А вообще, чтобы узнать состояние любого объекта ОС, нужен его хендл.


Suntechnic   (2002-03-21 16:38:00) [6]

>lipskiy © (21.03.02 16:15)
>:)) Ух ты. Нет, а что это такое и как это юзать?
А хелп открыть пробовал? ;)

>Например, я вышел из программы, как узнать, что и поток убит?
А то слышал, что он может остаться там висеть.

Поясни термин "вышел из программы", тогда может тебе и расскажут может что-то остаться висеть или нет....


lipskiy   (2002-03-21 16:15:00) [7]

> GetExitCodeThread пробовал?
:)) Ух ты. Нет, а что это такое и как это юзать?

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


Aleksandr   (2002-03-21 16:03:00) [8]

Слушайте, может, я вам тогда весь код модуля приведу, а вы взглядами спецов скажите, где там топоры висят?


vuk   (2002-03-21 15:54:00) [9]

to Aleksandr:
Все зависиот от кода, которого мы не видим (FoundWork и DoSomething). А вот завершения Вашего потока придется ждать как минимум 2 секунды.


Aleksandr   (2002-03-21 15:53:00) [10]

2 Digitman
Я имею в виду, будет жрать ресурсы в случае простоя, то есть когда DoSomething не выполняется?


Suntechnic   (2002-03-21 15:48:00) [11]

>Aleksandr © (21.03.02 15:40)
В таком варианте как у тебя он 2 секунды ничего делать не будет.

Надо условие задачи видеть, чтобы сказать имеет ли это смысл или нет. В случае lipskiy условие описано.

>lipskiy © (21.03.02 15:40)
>Как убедиться, что поток умер?
GetExitCodeThreadпробовал?


Digitman   (2002-03-21 15:46:00) [12]

>Aleksandr
А как ты думал ?!
DoSomething - процедура ? она ж требует процессорное время для выполнения инструкций, ее составляющих ?


Aleksandr   (2002-03-21 15:40:00) [13]

Сорри, коллеги, что-то я тут немного не уловил темы...
То есть, если у меня в программе есть потоки с таким вот телом:

repeat
if FoundWork then
DoSomething;
Sleep(2000)
until Terminated;</>
то они будут жрать ресурсы?


lipskiy   (2002-03-21 15:40:00) [14]

> Не знаю, есть ли смысл продолжать
Есть! Я всегда читаю свои ветки до конца и не свои, но заинтересовавшие - тоже, ти всегда рад новой инфе.

Работаю под Win2k, но прога должна нормально жить под любой ОС - распространяется свободно через инет. Под "работаешь" имеется ввиду только "пишешь" или вообще где она может быть запущена?

А таймаут я ставлю 1000 (второй параметр WaitForSingleObject, да?), так что застрять не должен.

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


Suntechnic   (2002-03-21 15:38:00) [15]

>Набережных С. (21.03.02 14:56)
Ты не можешь понять одной вещи. Поток НИЧЕГОне делает, кроме как ждёт событие, а процессорное время пожирает по полной программе(что тебе и продемонстрирует Task Manager). Нет оно то конечно можно и так, но ЗАЧЕМ? Если можно сделать чтобы поток просто спал до наступления события ни на что не претендовал.

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


Вот это по нашенски. Прямо как в анекдоте "...посмотрел я на карту, сколько там той Кубани..."

P.S. У меня натура такая пытаюсь людям глаза открыть, даже если они этого и не хотят. Надо наверное с этим заканчивать...


Набережных С.   (2002-03-21 14:56:00) [16]


> Suntechnic © (21.03.02 03:42)

Не знаю, есть ли смысл продолжать, но все-же отвечу. Есть такая штука - вытесняющая многозадачность. Она в полной мере реализована в NT и почти в полной в 9X. Любой поток получит ровно столько процессорного времени, сколько ему предоставит ОС в соответствии с его приоритетом. Если в данный момент нет других активных потоков, он получит все процессорное время(за вычетом расходов ядра). Если есть - получит свою долю. В рассматриваемом случае никакого хоть сколько-нибудь заметного влияния ни на систему, ни на приложение он не окажет, и никаких ресурсов не "сожрет", тем более, что запускается на несколько минут.
Прикинь, сколько сейчас активных потоков в сервере, через который мы общаемся и как это влияет на время отклика для отдельного клиента.
P.S. Мало смотреть на Task Manager, надо-бы еще понимать смысл увиденного.


> lipskiy ©

Если ты работаешь под 9х, будь очень осторожен с WaitFor... без таймаута. Я довольно давно не имел с 9х дела, но помню, что там с ней гораздо легче попасть в непроходимый тупик, чем под NT.
Такой, из которого выход - только через "магическую тройку", а то и Reset.


lipskiy   (2002-03-21 11:59:00) [17]

Собственная переменная TimeOut у меня содержит полный таймаут, например - 60 сек, если нет коннекта - стоп. И по декременту через каждую секнду внутри цикла while я печатаю на главную форму оставшееся время ожидания, за этим и нужен цикл.

От компонента DialUp можно получить события connect/noconnect, но просто я не знаю, можно ли возбудить сигнализатор с параметром? Я сейчас просто флажок глобальный ставлю - с каким результатом возник этот один сигнализатор - при коннекте или при неконнекте. Но мне это не очень нравится.

Вот, вариант, предложенный vuk © (21.03.02 03:20) с WaitForMultipleObjects я просто не знал, думаю подойдет.

Хотя если можно-таки возбудить один сигнализатор с параметром - то это будет удобнее (Ну что-то типа SetEvent(True) или SetEvent(False)). Так никак нельзя?


Suntechnic   (2002-03-21 03:58:00) [18]

>Набережных С. (21.03.02 03:52)
Вот и чудненько.

Только один совет напоследок. Воплоти свою идею в жизнь. Запусти тестовый пример и посмотри в Task Manager-е сколько процессорного времени будет пожираться твоей программой. Того глядишь и взгляд свой на этот вопрос изменишь...


Набережных С.   (2002-03-21 03:52:00) [19]

Я достаточно хорошо и долго знаком с предметом. А вещи действительно очевидные.


Suntechnic   (2002-03-21 03:42:00) [20]

>Набережных С. (21.03.02 03:38)
>А ресурсы - event тоже ресурсы.

Я не собираюсь никому ничего доказывать, тем более очевидные вещи. Но рекомендовал бы тебе поближе ознакомится с предметом, прежде чем кому-то что-то советовать по данному вопросу...


Страницы:   1 2

Наверх

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