Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2012, 21:32   #11
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Кольша, goto не нужен. Можно в полне простым while not terminated do обойтись. И на основе этого предумал механизм с bool'ами и перетыками.

Вот топик интересный, но суть я его уловить не могу... http://programmersforum.ru/showthread.php?t=86662 надо наверное ещё раз 5 прочесть.
Человек_Борща вне форума Ответить с цитированием
Старый 17.08.2012, 21:33   #12
Кольша
Далеко не
Участник клуба
 
Аватар для Кольша
 
Регистрация: 11.08.2011
Сообщений: 1,512
По умолчанию

Можно и с while, но это будет уже не полный перезапуск..хотя мой вариант тоже не полный перезапуск..
Кольша вне форума Ответить с цитированием
Старый 17.08.2012, 22:25   #13
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

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

Поэтому твой вопрос сейчас звучит как "перезапустить поток, его не перезапуская", что наводит на мысли о проблеме X, Y и Z.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 17.08.2012, 22:28   #14
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Kix.IV Посмотреть сообщение
А можно изменить в потоке регистр CS:IP(кажись так называется)?
Это возможно, но это крайне плохая идея.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 17.08.2012, 22:32   #15
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Цитата:
Сообщение от Kix.IV Посмотреть сообщение
А можно изменить в потоке регистр CS:IP(кажись так называется)?
Цитата:
Сообщение от Kix.IV Посмотреть сообщение
Кажется функция SetThreadContext может менять регистры. Копай в эту сторону.
Если найдёшь, то отпишись пожалуйста. Стало интересно.
o_O отакэ клонов ... или сам с собой говорит товарищ...

по теме - была бы такая надобнсть , я написал бы для перезапуска класс и в него работу инкапсулировал, для перезапуска - suspend, пересоздаем объект класса, и resume, ну а цикл работы потока именно к объекту и обращается, хотя идея, конечно , не ахти, стоит поразмыслить о перепроектировании, как на то намекает Александр (GunSmoker)
phomm вне форума Ответить с цитированием
Старый 17.08.2012, 23:37   #16
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

GunSmoker,
Переписываю проверку обновления. Ранее исполтьзовался TTimer в котором создание потока повторялось надцать раз методом "Free потом Create ещё раз". ТВ понимании "перезапустить" я понимаю это как, эмм повторить метод execute, не уничтожая поток.
Тут возникают infinite-мысли на тему циклов while, repeat, goto.

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

Между тем и этим, поток должен работать, а именно проверять обновления программы. По ходу возникли вопросы:
1. как делать задержку потока, так чтобы её можно было прервать?
Ситуация: Задержка 30 минут, методом Sleep'а в Execute потока. Программа собираетсяприбиваться, а тут облом, поток в накауте, а программу нужно вырубить. Итог - юзер ждет надцать едениц времени. Не годится.

2. В потоке используется Synapse, нужно вырубить его до Terminate или любой другой фигни. в принципе можно создать метод, который вызовет завершение работы сокета в OnTerminate. но я не вкурсе, До или ПОСЛЕ сработывает OnTerminate. Пойду смотреть исходники предков

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

4. Не могу придумать как реализовать следующее:
Поток проверил обновление, его надо скачать, когда юзер тыкает Скачать, поток должен начинать скачиваение а не перекачивать инфу заного и по условию начинать качать. Тут возникла мысль об эксплотации GOTO и LABEL, т.е. в execute висит while not terminated do и проверяются property переменные, и в зависимости от них скакать по меткам. Есть мнение, что так нельзя, не знаю почему.

5. Далее нужно как-то сообразить с прерыванием закачки файла. Возникла мысль сделать property, переменную обозначающую THTTPSend, и закрывать сокет. Возникла мысль реализовать метод потока.

Кто-нибудь, когда-нибудь, работал с Synapse или любыми др. сетевыми компонентами, как прерывать из работу при Terminate потока?

Последний раз редактировалось Человек_Борща; 17.08.2012 в 23:46.
Человек_Борща вне форума Ответить с цитированием
Старый 18.08.2012, 00:03   #17
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

offtopic mode on

Зачем нужен периодический опрос? Для 90% программ достаточна одноразовая проверка при запуске.

Цитата:
повторить метод execute, не уничтожая поток
Я бы не называл это перезапуском.

Цитата:
Переписываю проверку обновления. Ранее исполтьзовался TTimer в котором создание потока повторялось надцать раз методом "Free потом Create ещё раз".
Непонятно, для каких целей тут поток. Вроде задача строго на таймер.

offtopic mode off

1. Есть три варианта.

а). Вместо Sleep используется WaitForSingleObject(Event, задержка), где Event - описатель сброшенного события. Надо выйти? Возбуждаем событие. Поток выскочит из сна раньше времени, увидит, что мы выходим, и завершится.

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

в). Если вопрос только в выходе из программы, то можно просто сохранить все данные и сделать TerminateProcess.

2. Не понятно. В методе Execute будет:
Код:
Init
try
  while not Terminated do
  begin
    CheckUpdates;
    WaitForSingleObject(WakeUp, Timeout);
  end;
finally
  Done
end;
OnTerminate вызывается после завершения Execute.

3. В варианте с WaitForSingleObject достаточно возбудить событие без установки флага Terminated.

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

5. Зависит от используемой библиотеки, не имеет отношения к потокам. Я не в курсе Synapse.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 18.08.2012, 00:11   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
2. Не понятно. В методе Execute будет:
я думаю там можно вместо события, потоку самого себя усыплять и потом продолжать.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.08.2012, 10:58   #19
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
Радость

Цитата:
Сообщение от phomm Посмотреть сообщение
o_O отакэ клонов ... или сам с собой говорит товарищ...

по теме - была бы такая надобнсть , я написал бы для перезапуска класс и в него работу инкапсулировал, для перезапуска - suspend, пересоздаем объект класса, и resume, ну а цикл работы потока именно к объекту и обращается, хотя идея, конечно , не ахти, стоит поразмыслить о перепроектировании, как на то намекает Александр (GunSmoker)
Просто сначала пришла идея сменить регистр, а позже я нашёл функцию SetThreadContext, которая может это сделать, вот и написал. Действительно со стороны выглядит, как общение с самим собой.
Kix.IV вне форума Ответить с цитированием
Старый 18.08.2012, 11:02   #20
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Человек_Борща, возможно я тебя не правильно понял, но при чём здесь перезапуск? Единственный смысл это сохранение одного и того же хэндла. Больше применения я не вижу.
Предлагаю сделать в конце потока что-то типа WaitForSingleObject, а после запуск нового потока и уничтожение себя.(Но проще сделать цикл).
Kix.IV вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Файл на сайте и как узнать его modified без скачивания его celovec Работа с сетью в Delphi 2 06.09.2011 16:30
Если остановился поток (TThread). Как перезапустить без потери памяти Zuzlan Общие вопросы Delphi 9 01.02.2011 13:57
Как оповестить основной поток о каком-то событии в потоке (TThread)? TwiX Общие вопросы Delphi 2 11.02.2010 02:57
Отобразить рабочий поток (TThread) NervniiJ Общие вопросы Delphi 0 10.01.2010 17:34
Проверка объекта после его уничтожения AHTuKiLLeR Общие вопросы Delphi 1 19.06.2009 10:43