![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильно ли работаю с потоками? [D7, XP]
Lamer6666 © (2011-07-26 23:27:00)Доброго времени суток уважаемые!
Решаю следующую задачу, по таймеру получаю методом GET информацию. Данную задачу необходимо реализовать в потоке. Делаю так:
Описал тип
type
TKdServerThread = class(TThread)
private
Procedure GetIn;
protected
procedure execute; override;
end;
Процедура исполнения:
Procedure TKdServerThread.execute;
begin
Synchronize(GetIn);
end;
Выполняю нужный мне код:
Procedure TKdServerThread.GetIn;
begin
Try
Form1.Memo1.Lines.Add(IdHTTP99.Get('....'));
Except
End;
Application.ProcessMessages;
end;
Далее по таймеру запускаю потоки:
procedure TForm1.Timer1Timer(Sender: TObject);
var NewThread: TKdServerThread;
begin
NewThread:=TKdServerThread.Create(true);
NewThread.FreeOnTerminate:=true;
NewThread.Priority:=tpLowest;
NewThread.Resume;
end;
вопрос:
1. Правильно ли реализовано решение?
2. Что будет если один из потоков повиснет при выполнении метода GET, продолжат ли работу остальные потоки?
3. Как ограничить количество потоков, есть некий параметр показывающий кол-во работающих потоков, или нужно считать кол-во созданных потоков самому?
Огромное спасибо.
antonn (2011-07-28 13:21:00) [1]
> ты описал задачу с "административным"(нежелание программиста
> работать нормально возведенное в ранг...) решением не использовать,
> а не реальной "не нужности" по задаче.
обязательного наличия кеша не требуется, сервис редко перезагружается.
сделано как мелкое удобство.
еще вопросы?
sniknik (2011-07-28 13:13:00) [2]ты описал задачу с "административным"(нежелание программиста работать нормально возведенное в ранг...) решением не использовать, а не реальной "не нужности" по задаче.
разница.
так можно и по другому "решить" типа - вешается комп от программы? ну и что, нам не нужна ее нормальная работа, мы после этого комп перезагружаем.
antonn (2011-07-28 13:05:00) [3]странный ты тип, я описал задачу и где в ней стоит пустая секция, а ты поливаешь водой, криво и язвительно пытаешься "съехать"...
sniknik (2011-07-28 13:00:00) [4]вообще хорошие аргументы, если что, то "а мне это не нужно", хотя рассуждения до этого были глобальными, и советы тоже.
sniknik (2011-07-28 12:58:00) [5]> по существу еще что нибудь есть что сказать?
в службу поддержки тебя, на вразумление...
> этой системой и пользуется техподдержка. это вебсервер, у всех показывает одно и то же. данное поведение - регламентировано.
это как раз тот частный "зашоренный" случай, о чем ты нас упрекаешь? немногим отличается от домашней поделки, где точно не нужно ничего, т.к. сам не используешь, а если что есть исходники.
antonn (2011-07-28 12:41:00) [6]
> это ты почему то решил что юзеру не хочется видеть данные,
> а хочется смотреть в пустой экран.
а еще юзеру не хочется работать, хочется пить пиво и временами рыжую бабу.
по существу еще что нибудь есть что сказать?
> но как только кто-то обратится в поддержку с требованием
> "сделать нормально, вон у Васи все показывает", так поддержка
> тебя и проклянёт.
>
этой системой и пользуется техподдержка. это вебсервер, у всех показывает одно и то же. данное поведение - регламентировано.
sniknik (2011-07-28 12:31:00) [7]> Предлагаю всем воюющим сторонам внимательно прочитать
читал, и даже частично использую... могу дополнить - ексепты indy (не вдаваясь в обсуждение их самих) - EIdHTTPProtocolException, и ADO (если нужны полные "трассируюшие" ексепты от много командных скриптов) требуют особой обработки (по ссылке не разбирается) если хотим полную информацию, на ексепт с пустым месейджем например.
> [41] реальная ситуация
это не ситуация, это дурость, это ты почему то решил что юзеру не хочется видеть данные, а хочется смотреть в пустой экран. но как только кто-то обратится в поддержку с требованием "сделать нормально, вон у Васи все показывает", так поддержка тебя и проклянёт.
antonn (2011-07-28 12:24:00) [8]ладно, с позволения я тот пост сюда перенесу, чтобы на одной странице был и поближе:
Еще один примерчик: у меня программа строит списки, время от времени их пересчитывая, большие списки. И переодически сбрасывает кеш данных на диск. Если при запуске кеш окажется валидным то он будет загружен и пока будет идти перерасчет узер увидит данные за такое-то время сформированные (он и так вообще-то смотрит только данные кеша, который строится на этих вот больших списках, поэтому при старте программы кеш пустой и юзер смотрит в пустой экран).
Так вот мне глубоко пофиг почему не записался кеш, пофиг что там файл был занят, что было реад_онли, что винчестер сглючил или вообще пути для кеша не существует. Ну получу я код ошибки запрета записи на диск, и чего? юзеру это не нужно, а вполне вероятно он не сделает того о чем я его попрошу на основании этой ошибки (дать доступ на запись). А запишется кеш - ну и замечательно. Нет - переживем.
Поподробнее: в конфигурации программы указаны некоторые объекты (сервер pos-терминалов), программа загружает этот список серверов, коннектится на каждый, вытягивает списки самих pos-терминалов, опрашивает их, записывает результат обработки в результирующий список (путь будет list2). Переодически повторяет процедуру, сама она может занимать от 5 до 15 минут (в зависимости от кол-ва просматриваемых серверов).
Пользователь со стороны gui смотрит как раз результат обработки, причем работа с этой программой не является постоянной его деятельностью, а по необходимости (как раз для техподдержки, ага).
Этот list2 я иногда выгружаю в файловый кеш, дабы после перезапуска программы я мог загрузить этот кеш (если он валидный - по времени и структуре не "устарел") чтобы пользователь мог наблюдать результаты предыдущей проверки, а не смотреть в пустые окна ожидая пока пройдет первая обработка. Так вот этот пункт - не обязательный, и введен лишь как мелкое удобство для пользователя. Если я не смогу сохранить кеш - никто не умрет, пустой экран при перезапуске программы с уведомлением что идет перерасчет данных является нормальным. Однако если там что нибудь отобразится - хорошо.
Запись в файл идет в отдельном потоке, и этот поток никак не должен повлиять на работу сервиса в целом. Код ошибки мне не нужен, потому стоит try..except с пустой секцией обработки исключения.
antonn (2011-07-28 12:15:00) [9]
>
> а не придуманные ситуации, которых в принципе не должно
> быть.
[41] реальная ситуация
Игорь Шевченко (2011-07-28 12:12:00) [10]Предлагаю всем воюющим сторонам внимательно прочитать
http://delphikingdom.com/asp/viewitem.asp?catalogid=1392
после чего воевать с аргументами.
sniknik (2011-07-28 12:04:00) [11]> ну так приведи пример когда это РЕАЛЬНО необходимо.
хотя... выдуманный пример в этой теме будет офтопиком. приводи реальный, из опыта... и не боись, мы тебя из-за этого в зашоренности обвинять не будем.
sniknik (2011-07-28 12:01:00) [12]> Почему-то тут много спецов которые начинают опираться только на свой опыт, зашоренность мешает.
про него и спрашивали, опыт. ты еще "теме"? перечитай вопрос.
а не придуманные ситуации, которых в принципе не должно быть.
не "зашорен"? ну так приведи пример когда это РЕАЛЬНО необходимо.
> и что изменит комментарий в блоке в работающей программе? речь идет не о комментировании
отношение к тебе... возможно спасет от увольнения. ну после того как из-за твоих "тараканов" отдел поддержки пару месяцев потеряет, а фирма пару тройку клиентов...
если там будет действительно что-то серьезное, и по другому никак, написано, и эксперт с этим согласится.
> а не о сообщении кому либо кода ошибки
вообще претензии к тебе не из-за "сообщения кому либо", а из-за сокрытия факта глюка пустым ексептом... разница однако. если не видишь ее, да еще и упорно отрицаешь... ну не о чем с тобой больше говорить.
Dennis I. Komarov (2011-07-28 11:52:00) [13]"Ты что, дальтоник, Скрипач — зелёный цвет от оранжевого отличить не можешь?" (C)
antonn (2011-07-28 11:46:00) [14]
> и даже если есть ОЧЕНЬ ОЧЕНЬ редкая, с вероятностью стремящейся
> к 0, крайняя необходимость
значит может, не так ли?
> даже не могу придумать
ключевое. Почему-то тут много спецов которые начинают опираться только на свой опыт, зашоренность мешает. Так же как про окна выше всех, окна не сворачивающиеся по win+d и прочее - везде летят каки что так нельзя, резко так отвечают. Вот как раз опыта мало. И если я (это же я!!! да я!..) не могу придумать - то этого нет. Как в детском садике - "Я в домике!" :)
> если бы "не может" то это была бы синтаксическая ошибка.
кавычки
> а после наполнить "пустой" блок ексепта подробным комментарием
> почему он пуст...
и что изменит комментарий в блоке в работающей программе? речь идет не о комментировании, а не о сообщении кому либо кода ошибки
Dennis I. Komarov (2011-07-28 11:38:00) [15]
> Понимание приходит с опытом.
Да пускай получает шишки, но зачем других толкать на "заграбленный" путь?
sniknik (2011-07-28 11:38:00) [16]> читай возле выделенного, там есть все
читаю...
> т.е. что пустой секции ... быть не должно.
что "все" в этом есть?
> там же есть вопрос
а вопрос... т.е. вопрос (там где знак ? в конце предложения)
> Такая логика?
какая логика? и чья? ведь все, что было до этого вопроса ты частично выдумал, частично, извратил. на что отвечать?
вот это и есть, то про что говорил, превращение диалога в срачь, ничего ясного, никаких понятных высказываний только "я это говорил, читайте меня, я гений, скоро опубликуюсь, учитесь толковать мои высказывания, ищите в них тайный правильный смысл... главное запомните, там все правильно, даже если сказано криво, и вами не понято читайте заново".
> меня переубеждают "не может".
не "не может", а "не должно быть", и желательно никогда... и даже если есть ОЧЕНЬ ОЧЕНЬ редкая, с вероятностью стремящейся к 0, крайняя необходимость, не по приведенному тобой, глупому примеру, где ее нет, а реальная, даже не могу придумать где и как оно может возникнуть... но допустим есть. даже в этом случае рекомендуется еще раз подумать... а после наполнить "пустой" блок ексепта подробным комментарием почему он пуст...
если бы "не может" то это была бы синтаксическая ошибка.
Loginov Dmitry (2011-07-28 11:28:00) [17]
> Для чего-то ж существуют грабли, тяпки
+1
Понимание приходит с опытом.
Anatoly Podgoretsky (2011-07-28 11:28:00) [18]> antonn (28.07.2011 11:20:04) [64]
Если была твоя тема, то давно уже бы там оказалась, мне проще запретить тебе
писать и справедливо по отношению к другим будет.
Anatoly Podgoretsky (2011-07-28 11:21:00) [19]> antonn (27.07.2011 16:44:28) [28]
И в итоге имеем вечное НЕТ и проклятье пользователей или службы поддержки
antonn (2011-07-28 11:20:00) [20]PS тему в прочее не перенесете?