|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
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 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Ты сначала скажи, что понимается под "перезапустить поток". Потому что в моём понимании "перезапустить поток" - это как раз удалить и заново создать. Это, собственно, и есть определение перезапуска чего-угодно.
Поэтому твой вопрос сейчас звучит как "перезапустить поток, его не перезапуская", что наводит на мысли о проблеме X, Y и Z.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
17.08.2012, 22:28 | #14 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
Это возможно, но это крайне плохая идея.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
17.08.2012, 22:32 | #15 | |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,882
|
Цитата:
по теме - была бы такая надобнсть , я написал бы для перезапуска класс и в него работу инкапсулировал, для перезапуска - suspend, пересоздаем объект класса, и resume, ну а цикл работы потока именно к объекту и обращается, хотя идея, конечно , не ахти, стоит поразмыслить о перепроектировании, как на то намекает Александр (GunSmoker) |
|
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 | ||
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
offtopic mode on
Зачем нужен периодический опрос? Для 90% программ достаточна одноразовая проверка при запуске. Цитата:
Цитата:
offtopic mode off 1. Есть три варианта. а). Вместо Sleep используется WaitForSingleObject(Event, задержка), где Event - описатель сброшенного события. Надо выйти? Возбуждаем событие. Поток выскочит из сна раньше времени, увидит, что мы выходим, и завершится. б). Скомандовать потоку остановку и не ждать его, а просто забыть. Когда спячка истечёт, поток увидит, что надо выходить и сам себя закроет. в). Если вопрос только в выходе из программы, то можно просто сохранить все данные и сделать TerminateProcess. 2. Не понятно. В методе Execute будет: Код:
3. В варианте с WaitForSingleObject достаточно возбудить событие без установки флага Terminated. 4. Не ясно, зачем этим должен заниматься поток проверки обновления. Я бы сделал отдельный поток, это существенно проще. 5. Зависит от используемой библиотеки, не имеет отношения к потокам. Я не в курсе Synapse.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
||
18.08.2012, 00:11 | #18 | |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
|
18.08.2012, 10:58 | #19 | |
Участник клуба
Регистрация: 11.08.2012
Сообщений: 1,226
|
Цитата:
|
|
18.08.2012, 11:02 | #20 |
Участник клуба
Регистрация: 11.08.2012
Сообщений: 1,226
|
Человек_Борща, возможно я тебя не правильно понял, но при чём здесь перезапуск? Единственный смысл это сохранение одного и того же хэндла. Больше применения я не вижу.
Предлагаю сделать в конце потока что-то типа WaitForSingleObject, а после запуск нового потока и уничтожение себя.(Но проще сделать цикл). |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Файл на сайте и как узнать его 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 |