![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Software Developer
Старожил
Регистрация: 19.12.2008
Сообщений: 2,070
|
![]()
Всем привет. Возник вопрос по работе с потоками.
Вобщем, есть некий код ("запутанный в классы") который обрабатывает запрос к некоему сайту (авторизируется, забирает нужную информацию, отправляет информацию и т.п.). Как можно понять, при обработке всего этого программа ясное дело "молчит". Посему было решено, некоторый участок кода, который занимается обработкой - вынести в поток. Но появились же вопросы (хотя вроде и перечитал достаточно мануалов, но все равно на практике никогда с потоками не сталкивался поэтому решил уточнить/узнать некоторые моменты). Вот мой пример того, что сделал (код подчищен - убраны лишние участки для читаемости): Код:
![]() Заранее спасибо. Надеюсь никого не испугаю написанным здесь... ![]()
Будь проще и люди к тебе потянутся
Последний раз редактировалось spamer; 31.03.2011 в 23:44. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Кажется, тебе сюда.
По коду: 1. После этих строк: Код:
2. Код:
Код:
Код:
Код:
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#3 | ||
Software Developer
Старожил
Регистрация: 19.12.2008
Сообщений: 2,070
|
![]() Цитата:
С остальными пунктами вроде более ли мение ясно... Такс, а вот насчет этого: Цитата:
// Уничтожение всего того, что было создано - тут уже идет непосредственное уничтожение всех темповых объектов которые должны были что-то передать главному, перед тем как главный объект запустит свою цепочку действий (можно сказать - основной алгоритм для соответствующего типа объекта); затем удаление именно основных объекта; некоторых менеджеров...ну и т.п. Вобщем, насколько я понял, должно быть что-то типа такого? Код:
Код:
Ах и да, а как же быть с ситуацией закрытия приложения во время обработки потока? Не, ну можно конечно пойти более простым путем - выдавать диалог с информацией о состоянии обработки и этим же запретить закрытие приложения пока все не отработает...но все же интересно как это с потоками именно провернуть... Насчет приведенной ссылки - большое спасибо - я думаю данный материал также понадобится...возможно и в этой ситуации он как-то поможет, только разберусь что к чему там...
Будь проще и люди к тебе потянутся
Последний раз редактировалось spamer; 01.04.2011 в 01:50. |
||
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#5 | |||
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]() Цитата:
Это можно обойти, но чем обходить - лучше убрать FreeOnTerminate. Не для того оно предназначено. Цитата:
Ты определись - ты хочешь действия в потоке выпонять синхронно или асинхронно? Т.е. синхронно - это: что-то делаешь, запустил поток, потом ждёшь, пока поток не отработает, продолжаешь работать дальше. Асинхронно - это: что-то делаешь, запустил поток, продолжаешь работать дальше, когда поток завершается - ты доделываешь ещё работу. Продумай какие действия куда сувать. И где делать очистку. Так чтобы не получилось, что ты сперва данные грохнул, а потом с ними кто-то работать собирается. Цитата:
Во время ожидания потока работает интерфейс и UI не виснет.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
|||
![]() |
![]() |
![]() |
#6 | ||
Software Developer
Старожил
Регистрация: 19.12.2008
Сообщений: 2,070
|
![]() Цитата:
Цитата:
Будь проще и люди к тебе потянутся
|
||
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 06.12.2010
Сообщений: 300
|
![]()
Лучше заменить ProcessMessages на HandleMessage, чтобы не нагружать пустой работой проц.
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Если надо синхронно, то получаем:
Код:
Ну и по указанной ранее ссылке загляни - там проще будет: Код:
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#9 | ||
Software Developer
Старожил
Регистрация: 19.12.2008
Сообщений: 2,070
|
![]()
А можно еще уточнить, останавливать поток будем же в Execute(), т.е. так? -
Код:
Цитата:
Код:
Цитата:
Кстати, а могли бы вы, если не составит труда, показать пример и асинхронного варианта потока?
Будь проще и люди к тебе потянутся
Последний раз редактировалось spamer; 02.04.2011 в 01:49. |
||
![]() |
![]() |
![]() |
#10 | ||
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]() Цитата:
Terminate обычно вызывают по кнопке "Стоп". Цитата:
Должно быть: Код:
Код:
Нет времени.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
||
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
C# BackgroundWorker - завершение работы потока | Lastsummer | Помощь студентам | 2 | 16.03.2011 18:04 |
Работа с TThread | t2skler | Общие вопросы Delphi | 20 | 16.02.2011 19:14 |
при закрытии потока(Tthread) посылать на форму код ответа или сообщение | Человек_Борща | Общие вопросы Delphi | 2 | 14.12.2010 21:19 |
Работа с TThread | pesi | Общие вопросы Delphi | 2 | 09.08.2010 14:12 |
Как отследить завершение выполнения потока TThread? | Трик | Общие вопросы Delphi | 3 | 24.10.2007 14:55 |