Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];

Вниз

Правильно ли работаю с потоками?   Найти похожие ветки 

 
Lamer6666   (2011-07-26 23:27) [0]

Доброго времени суток уважаемые!
Решаю следующую задачу, по таймеру получаю методом 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-26 23:36) [1]

Не правильно, этот код выполнится полностью в главном потоке+накладные расходы на доп.поток.
нужно в Execute получить текст страницы (IdHTTP99.Get("....")) в переменную, а в GetIn() запихнуть в мемо эту переменную.


 
Lamer6666   (2011-07-26 23:49) [2]


> Execute получить текст страницы (IdHTTP99.Get("....")) в
> переменную, а в GetIn() запихнуть в мемо эту переменную.
>

Понял, переделываю.


 
Игорь Шевченко ©   (2011-07-26 23:56) [3]


> Процедура исполнения:
> Procedure TKdServerThread.execute;
> begin
>   Synchronize(GetIn);
> end;


Вот скажите мне, откуда этот код ?


 
Германн ©   (2011-07-27 00:05) [4]


> Вот скажите мне, откуда этот код ?

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1082
:)


 
Lamer6666   (2011-07-27 00:12) [5]

Статейки нарыл в Интернет под заголовком "Работа с потоками"
:)
А что в нем не так?


 
Германн ©   (2011-07-27 00:17) [6]


> А что в нем не так?

Процедура Execute.


 
Lamer6666   (2011-07-27 00:18) [7]

Имеете ввиду что данные в основной поток надо передавать "Сообщением"?


 
sniknik ©   (2011-07-27 00:21) [8]

> Статейки нарыл в Интернет под заголовком "Работа с потоками"
врешь небось? пруф где?


 
sniknik ©   (2011-07-27 00:23) [9]

> передавать "Сообщением"?
молнией! откуда выводы о не написаном?


 
Lamer6666   (2011-07-27 00:24) [10]


> врешь небось? пруф где?

http://compconnect.ru/2010/10/rabota-s-potokami-v-delphi-7/
:)
Народ дайте ссылку на правильный код, для, так сказать детального изучения.
))


 
sniknik ©   (2011-07-27 00:29) [11]

> http://compconnect.ru/2010/10/rabota-s-potokami-v-delphi-7/
> :)
и правда врешь, т.к. там такого не написано, там все правильно.

> Народ дайте ссылку на правильный код
пожалуйста, вполне правильная ссылка
http://compconnect.ru/2010/10/rabota-s-potokami-v-delphi-7/


 
Lamer6666   (2011-07-27 00:30) [12]

Читаю внимательнее... Спасибо.


 
Lamer6666   (2011-07-27 00:43) [13]

Процедура исполнения:
Procedure TKdServerThread.execute;
begin
  Try
     StrParam1:=IdHTTP99.Get("....");
  Except
  End;
 Application.ProcessMessages;  
 Synchronize(Memo1UpDate);
end;

Выполняю нужный мне код:

Procedure TKdServerThread.Memo1UpDate;
begin
Memo1.....:=StrParam1;
end;

так верно?


 
Lamer6666   (2011-07-27 00:44) [14]

Процедура исполнения:
Procedure TKdServerThread.execute;
begin
 Try
    StrParam1:=IdHTTP99.Get("....");
    Application.ProcessMessages;
 Except
 End;
Synchronize(Memo1UpDate);
end;

Выполняю нужный мне код:

Procedure TKdServerThread.Memo1UpDate;
begin
Memo1.....:=StrParam1;
end;

так верно?


 
Германн ©   (2011-07-27 00:46) [15]


> Lamer6666   (27.07.11 00:30) [12]
>
> Читаю внимательнее... Спасибо.
>

Там всё написано правильно. Только не по


 
Игорь Шевченко ©   (2011-07-27 00:48) [16]

нафиг тебе вообще потоки ?


> http://compconnect.ru/2010/10/rabota-s-potokami-v-delphi-
> 7/


в топку такие примеры.

Хотя бы здесь почитай: http://forum.vingrad.ru/topic-60076.html


 
Lamer6666   (2011-07-27 00:54) [17]

В ситуациях, когда некие действия могут вызвать существенную задержку в одном из потоков (например, ожидание ввода от пользователя), часто желательно, чтобы программа имела возможность осуществлять другие действия независимо (например, фоновую проверку орфографии или обработку входящих сетевых сообщений).

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


 
Германн ©   (2011-07-27 00:54) [18]


> так верно?
>

Нет. Не верно.
Во-первых вызов процедуры Application.ProcessMessages в доппотоке не имеет никакого смысла.
Во-вторых пустая часть Except защищенного блока - единица в дневнике!
В-третьих. А чего записывать в Мемо, если Get не получился?

P.S.
В четвертых - не знаю Инди. Так что и не знаю как работает метод TIdHTTP.Get.


 
Lamer6666   (2011-07-27 00:58) [19]


> Нет. Не верно.
> Во-первых вызов процедуры Application.ProcessMessages в
> доппотоке не имеет никакого смысла.
> Во-вторых пустая часть Except защищенного блока - единица
> в дневнике!
> В-третьих. А чего записывать в Мемо, если Get не получился?
>
>

Согласен с Application.ProcessMessages. По поводу Except она будет заполнена, но речь пока не о ней, а о конструкции потока.  Synchronize(Memo1UpDate); будет поднято в Try (не внимательность), а при неудаче сработает  Except .

Procedure TKdServerThread.execute;
begin
Try
   StrParam1:=IdHTTP99.Get("....");
   Synchronize(Memo1UpDate);
Except
   //код обработки исключительной ситуации
End;
end;


 
Lamer6666   (2011-07-27 01:15) [20]

В общем как я понял, процедура execute выполняет все действия вычисления и записывает результат в параметр. Далее процедура Synchronize присваивает значение вышеуказанного параметра объекту главного процесса.


 
Германн ©   (2011-07-27 01:23) [21]


> Lamer6666   (27.07.11 01:15) [20]
>
> В общем как я понял, процедура execute выполняет все действия
> вычисления и записывает результат в параметр. Далее процедура
> Synchronize присваивает значение вышеуказанного параметра
> объекту главного процесса.

Теоретически правильно.


 
antonn ©   (2011-07-27 01:55) [22]


> Во-вторых пустая часть Except защищенного блока - единица
> в дневнике!

Вовсе нет, когда не важно какая ошибка там будет, главное чтобы в потоке не решило появится окошко эксепшена (от этих вот raise я и перешел на синапс, сделал операцию - проверил результат, а не городить эти блоки чтобы гасить эксепшн).
И особенно когда не сильно важно узнать что получилось в результате и не нужна гарантия выполнения - зачем мне знать что там приключилось?


 
Германн ©   (2011-07-27 02:02) [23]


> antonn ©   (27.07.11 01:55) [22]
>
>
> > Во-вторых пустая часть Except защищенного блока - единица
> > в дневнике!
>
> Вовсе нет, когда не важно какая ошибка там будет, главное
> чтобы в потоке не решило появится окошко эксепшена (от этих
> вот raise я и перешел на синапс,

А когда не важно?
И что нам всем переходить на синапс?


 
sniknik ©   (2011-07-27 09:40) [24]

> И особенно когда не сильно важно узнать что получилось в результате и не нужна гарантия выполнения - зачем мне знать что там приключилось?
и зачем тогда что-то городить? неважно же. код надо переписать так -
Procedure TKdServerThread.execute;
begin
 Try
    //результат этого неважен поэтому нафиг он нужен? убираем
 Except
    //код обработки исключительной ситуации
 End;
end;

ну вот так получше. правда стало - а нафига нужен вообще этот execute/поток...


 
Anatoly Podgoretsky ©   (2011-07-27 11:28) [25]

> Игорь Шевченко  (26.07.2011 23:56:03)  [3]

Книгу толстую прочитал


 
antonn ©   (2011-07-27 16:23) [26]


> sniknik ©   (27.07.11 09:40) [24]
>
> Procedure TKdServerThread.execute;
> begin
>  Try
>     //результат этого неважен

результат этого важен. переписать


> Германн ©   (27.07.11 02:02) [23]
>
>
> А когда не важно?

когда это не критично.
код првоерки в фоне наличие обновлений:
Procedure TKdServerThread.execute;
begin
 result_code:=0;
Try
   result_code:=GetUpdateAvailable("...");
Except
End;
 Synchronize(GetIn); //передаю result_code основному потоку
end;


юзеру незачем знать почему нельзя достучаться до сервера когда проверка происходит в фоне, он может заниматься другими делами. Конкретную ошибку можно захотеть получить при непосредственном желании юзера или разработчика обновить софт, когда этот юзер будет ожидать действия программы на попытку првоерки обновления (например нажмет кнопку "проверить обновления").
А в фоне - ну не получилось и хрен с ним. Не критично.


 
Dennis I. Komarov ©   (2011-07-27 16:42) [27]

т.е. на кнопку писать отдельный код для обновления? бред...

а если на кнопке обновляется "по тихому" нет?

а может очень даже критично...

Для фоновых процессов надо вести лог, возможно отключаемый, но пустая секция except плохо


 
antonn ©   (2011-07-27 16:44) [28]


> а может очень даже критично...

может, все может


> Для фоновых процессов надо вести лог, возможно отключаемый,
>  но пустая секция except плохо

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


 
sniknik ©   (2011-07-27 16:48) [29]

> код првоерки в фоне наличие обновлений:
антивирусы, те, что юзал показывали... не всплывающими сообщениями конечно, это действительно нафиг не нужно, а статусом у задачи по обновлению (красный значок с расшифровкой ошибки если по нему кликнуть).
т.е. обработка у них есть.
а больше и нету ничего, что требует постоянного обновления, в фоне. ну у меня по крайней мере.


 
Dennis I. Komarov ©   (2011-07-27 16:52) [30]


> antonn ©   (27.07.11 16:44) [28]

Значит ошибки должны обрабатываться внутри функции, с последующей возможностью узнать о ней если будет интересно, а-ля GetLastError


 
sniknik ©   (2011-07-27 16:55) [31]

> меня интересует результирующее "да или нет".
а меня, как юзера, интересует почему вдруг не сработало назначенное мной же авто обновление, и можно ли исправить/настроить.
а то и получится так что ручное работает а авто нет, код то разный, и нафиг оно мне нужно тогда? а если покажет (лог/статус/...) то окажется например что файрвол "мудрит"/не настроен. и все решится в пять минут.

> юзеру незачем знать
вместо того чтобы решать за юзера, думай как сделать нормально. а то так до решаешься до принципов коммунизма, это когда "товарищи! сегодня потребности в мясе нет.".


 
antonn ©   (2011-07-27 16:59) [32]


> а статусом у задачи по обновлению (красный значок с расшифровкой
> ошибки если по нему кликнуть).

как я и говорил - да или нет. А не "я не могу проверить обновление потому что некий someclass не может вызвать свой метод потому что у него там что то ен получается и вот вам Getlasterror 123456".


> Dennis I. Komarov ©   (27.07.11 16:52) [30]
>
>
> > antonn ©   (27.07.11 16:44) [28]
>
> Значит ошибки должны обрабатываться внутри функции, с последующей
> возможностью узнать о ней если будет интересно, а-ля GetLastError

просто чтобы уточнить - вот если вот тут вылезет эксепшн - тоже в отдельную функцию заворачивать? :) он, кстати, погасится или нет?
А если подобный код есть в каких нибудь "индях" ил других классах? вон в jpeg есть такой момент когда сканлайн прямо указывается с индексом 1, в результате вылезут баги при работе с картинкой в 1 пиксель высотой. Там где мне надо - я перехвачу исключение, но в целом приходится вот так поступать чтобы вообще все приложение не порушилось.
var st:tstrings;
begin

st:=tstringlist.create;
try
 st.loadfromstream();
 st.soft;
 st.strings[512]:="babax!";
finally
 st.free;
end;

end;


 
antonn ©   (2011-07-27 17:00) [33]


> а то и получится так что ручное работает а авто нет, код
> то разный

ага, в одном обработчик исключений есть, а в другом нет. Поэтому вручную все работает, а в фоне нет.
Песня :)


 
sniknik ©   (2011-07-27 17:07) [34]

> как я и говорил - да или нет
долго учился читать только интересное/подтверждающее себя любимого?

расшифровка ошибки есть, у тебя же с пустым и типа неважным ексептом ее не может быть в принципе. (в данном коде, т.что не надо про winapi с функциями возвращающими... и еже с ними.)


 
sniknik ©   (2011-07-27 17:09) [35]

> ага, в одном обработчик исключений есть, а в другом нет. Поэтому вручную все работает, а в фоне нет.
> Песня :)
ты дебил или притворяешься?


 
antonn ©   (2011-07-27 17:12) [36]

я над ними смеюсь.
жестковато? отнюдь :)


 
Dennis I. Komarov ©   (2011-07-27 17:22) [37]


> просто чтобы уточнить - вот если вот тут вылезет эксепшн
> - тоже в отдельную функцию заворачивать? :)

см. [35]


 
antonn ©   (2011-07-27 17:24) [38]


> Dennis I. Komarov ©   (27.07.11 17:22) [37]

посоветую почитать все с начала


 
Dennis I. Komarov ©   (2011-07-27 17:31) [39]


> antonn ©   (27.07.11 17:24) [38]

причем тут с начала, когда если пишешь код [32] то ССЗБ
... и при этом задаешь откровенно глупые вопросы. Это как расценивать?


 
antonn ©   (2011-07-27 17:34) [40]


> причем тут с начала, когда если пишешь код [32] то ССЗБ

а если этот код пишет борланд?

но вернемся к моей просьбе: Герман высказался против пустой секции, я высказался что такое решение омеет право на жизнь в зависимости от ситуации. меня начали переубеждать в обратном, т.е. что пустой секции никогда и ни при каких обстоятельствах быть не должно. Такая логика? Вот и смеюсь, такие все жутко правильные и педантичные куда бы деться :)


 
antonn ©   (2011-07-27 17:40) [41]

Еще один примерчик: у меня программа строит списки, время от времени их пересчитывая, большие списки. И переодически сбрасывает кеш данных на диск. Если при запуске кеш окажется валидным то он будет загружен и пока будет идти перерасчет узер увидит данные за такое-то время сформированные (он и так вообще-то смотрит только данные кеша, который строится на этих вот больших списках, поэтому при старте программы кеш пустой и юзер смотрит в пустой экран).
Так вот мне глубоко пофиг почему не записался кеш, пофиг что там файл был занят, что было реад_онли, что винчестер сглючил или вообще пути для кеша не существует. Ну получу я код ошибки запрета записи на диск, и чего? юзеру это не нужно, а вполне вероятно он не сделает того о чем я его попрошу на основании этой ошибки (дать доступ на запись). А запишется кеш - ну и замечательно. Нет - переживем.


 
Dennis I. Komarov ©   (2011-07-27 17:42) [42]

А еще был приведен довольно неудачный пример, якобы когда это допустимо...


 
antonn ©   (2011-07-27 17:48) [43]


> Dennis I. Komarov ©   (27.07.11 17:42) [42]

какой именно?


 
Dennis I. Komarov ©   (2011-07-27 17:58) [44]

И его? Если юзеру не надо видеть эту ошибку, то не показывай ее, но это не является основанием для того что-бы оставить пустой блок except. Реализуй различные режимы, при которых можно посмотреть некое отладочное окно, дабы после можно было получить действительно "нет доступа". Потому как иначе, кто-нить потом чего-нить оторвет...


 
Dennis I. Komarov ©   (2011-07-27 17:58) [45]


> какой именно?

update


 
antonn ©   (2011-07-27 18:04) [46]


> Dennis I. Komarov ©   (27.07.11 17:58) [45]
>
>
> > какой именно?
>
> update

какой update?


> Реализуй различные режимы, при которых можно посмотреть
> некое отладочное окно, дабы после можно было получить действительно
> "нет доступа".

какое еще окно и кто в него будет смотреть? нет доступа для чего? мы сейчас обсуждаем пример с кешем? так юзеру вообще все равно где там нет доступа, а мне так же все равно есть ли кеш или нет. Если есть - хорошо, но не обязательно, лишний поклон перед юзером. Если нет - ну подождет до первого перерасчета данных, посмотрит на анимацию. Момент не критичный. Более того, в этом примере вообще нет обратной связи, поток вызывается и о нем, по сути, забываем.


 
Игорь Шевченко ©   (2011-07-27 19:12) [47]


> я высказался что такое решение омеет право на жизнь в зависимости
> от ситуации


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

Исключения-наследники EExternal или EHeapException, например, не игнорируются никогда. Я не уверен, что пишу безупречный код и тем более не уверен, что вызываемый мной сторонний код безупречен. Так пусть лучше сломается с треском.


 
antonn ©   (2011-07-27 19:15) [48]


> Так пусть лучше сломается с треском.

а если служба, никтож не увидит


 
Игорь Шевченко ©   (2011-07-27 21:05) [49]


> а если служба, никтож не увидит


А вот оракл под виндой тоже служба, а при падениях пишет в EventLog и в свой Alert log. Потом есть что почитать.


 
sniknik ©   (2011-07-27 21:13) [50]

> никтож не увидит
в службу поддержки тебя, на вразумление, после будешь знать этого "Никто"... в зеркале брить его будешь.


 
antonn ©   (2011-07-27 21:34) [51]


> в службу поддержки тебя, на вразумление, после будешь знать
> этого "Никто"... в зеркале брить его будешь.

ну не злись, все хорошо :)
речь как раз о том что никто не увидит если это будет мессаджбокс из под system не на декстопе юзера. Ярость глазки залила, это небыло сказано в контексте "все равно никто не увидит" =))


> Игорь Шевченко ©   (27.07.11 21:05) [49]
>
>
> А вот оракл под виндой тоже служба, а при падениях пишет в EventLog и в свой Alert log. Потом есть что почитать.

я так понял что эти эксепшны не обрабатываются и потому вылезают "стандартные" диалоги ошибок?


 
Игорь Шевченко ©   (2011-07-27 21:51) [52]

antonn ©   (27.07.11 21:34) [51]


> я так понял что эти эксепшны не обрабатываются и потому
> вылезают "стандартные" диалоги ошибок?


Если ты мой пост [47] имеешь в виду, то стандартных диалогов не вылезает, потому что на верхнем уровне стоит обработчик необработанных исключений, который пишет журнал ошибок (а для сервисов и/или в EventLog) с трассировкой стека, последними выполненными действиями, еще набором всяких данных, и отсылает, если заказано, письмо со всей этой информацией на указанные адреса. Такой вот Error reporter в миниатюре.

Я имею в виду, что во внутренних процедурах исключения не игнорируются все скопом, а только те, которые в данном участке кода могут быть безболезненно проигнорированы. Неспецифических примеров сходу привести не могу :)


 
Германн ©   (2011-07-28 00:26) [53]

Удалено модератором


 
antonn ©   (2011-07-28 00:30) [54]

Удалено модератором


 
Германн ©   (2011-07-28 00:37) [55]

Удалено модератором


 
Германн ©   (2011-07-28 00:51) [56]

Удалено модератором


 
antonn ©   (2011-07-28 01:23) [57]


> Как заранее знать что критично, а что нет не будучи господом
> богом?

на этапе планирования, разумеется :) когда там ТЗ составляется?


> +1

ты бы прочитал [51], а то "плюсадинишь" и выглядишь глупо :)


 
Германн ©   (2011-07-28 01:30) [58]

Удалено модератором


 
antonn ©   (2011-07-28 02:18) [59]


> Но тоже как любой технарь имею жизненный опыт техподдержки.

а то что sniknik не так понял мою фразу - это не важно? опыт техподдержки гораздо важнее, там важно быстро и точно ответить на вопрос который не задавался, молниеносно объяснить юзеру почему он не прав и что на самом деле у него все работает нормально :) "знаем, плавали"


 
MonoLife ©   (2011-07-28 07:32) [60]

оставьте в покое antonn"a!:)
ТС с опытом поймет в чем был не прав и как нужно делать, а как не рекомендуется.. Для чего-то ж существуют грабли, тяпки & etc ...:)


 
sniknik ©   (2011-07-28 08:13) [61]

Удалено модератором


 
antonn ©   (2011-07-28 11:09) [62]


> необработанный/пустой ексепт с сообщением у юзера..

нужно читать сообщения выше


> или то что ты стебешся отстаивая "возможность" (приводя
> кривые примеры), т.к. "противная сторона" говорит "никогда
> и ни при каких обстоятельствах"...? ну так покажи где она
> это сказала,

[40]
читай возле выделенного, там есть все, там же есть вопрос - можешь ответить на него и написать почему на мои утверждения "что может быть" меня переубеждают "не может". Логическую нить сохраняем :)


 
antonn ©   (2011-07-28 11:18) [63]

ну и включу КО, дабы помочь восстановить логическую цепочку, а то я смотрю некоторые читают только последнюю страницу.
[47] Игорь написал что игронирует те исключения в которых уверен (я в борланде тоже был уверен... :)), и если что - сломается с треском.
[48] если пложение в виде службы то мессаджбокс не увидим, а евентах (если самому ничего не делать дополнительного) будет что-то типа "Не найдено описание для события с кодом ( 0 ) в источнике ( ***** ). Возможно, на локальном компьютере нет нужных данных в реестре или файлов DLL с..". Т.е. чтобы уловить причину нужно ее отработать в этом случае. Потому что без try..except (даже пустой) приложение может вообще упасть, и без уведомлений почему она это сделала.
[49] Игорь говорит тоже самое на примере службы оракла - та пишет логи
[50] Господин в ярости блистает красноречием, отквотив [48] О_о
[56] Герман ставит плюсадин. Ты вообще с чем там хотел быть согласен, а?


 
antonn ©   (2011-07-28 11:20) [64]

PS тему в прочее не перенесете?


 
Anatoly Podgoretsky ©   (2011-07-28 11:21) [65]

> antonn  (27.07.2011 16:44:28)  [28]

И в итоге имеем вечное НЕТ и проклятье пользователей или службы поддержки


 
Loginov Dmitry ©   (2011-07-28 11:28) [66]


> Для чего-то ж существуют грабли, тяпки


+1

Понимание приходит с опытом.


 
Anatoly Podgoretsky ©   (2011-07-28 11:28) [67]

> antonn  (28.07.2011 11:20:04)  [64]

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


 
Dennis I. Komarov ©   (2011-07-28 11:38) [68]


> Понимание приходит с опытом.

Да пускай получает шишки, но зачем других толкать на "заграбленный" путь?


 
sniknik ©   (2011-07-28 11:38) [69]

> читай возле выделенного, там есть все
читаю...
> т.е. что пустой секции ... быть не должно.
что "все" в этом есть?

> там же есть вопрос
а вопрос... т.е. вопрос (там где знак ? в конце предложения)
> Такая логика?
какая логика? и чья? ведь все, что было до этого вопроса ты частично выдумал, частично, извратил. на что отвечать?

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

> меня переубеждают "не может".
не "не может", а "не должно быть", и желательно никогда... и даже если есть ОЧЕНЬ ОЧЕНЬ редкая, с вероятностью стремящейся к 0, крайняя необходимость, не по приведенному тобой, глупому примеру, где ее нет, а реальная, даже не могу придумать где и как оно может возникнуть... но допустим есть. даже в этом случае рекомендуется еще раз подумать... а после наполнить "пустой" блок ексепта подробным комментарием почему он пуст...
если бы "не может" то это была бы синтаксическая ошибка.


 
antonn ©   (2011-07-28 11:46) [70]


> и даже если есть ОЧЕНЬ ОЧЕНЬ редкая, с вероятностью стремящейся
> к 0, крайняя необходимость

значит может, не так ли?


> даже не могу придумать

ключевое. Почему-то тут много спецов которые начинают опираться только на свой опыт, зашоренность мешает. Так же как про окна выше всех, окна не сворачивающиеся по win+d и прочее - везде летят каки что так нельзя, резко так отвечают. Вот как раз опыта мало. И если я (это же я!!! да я!..) не могу придумать - то этого нет. Как в детском садике - "Я в домике!" :)


> если бы "не может" то это была бы синтаксическая ошибка.

кавычки


> а после наполнить "пустой" блок ексепта подробным комментарием
> почему он пуст...

и что изменит комментарий в блоке в работающей программе? речь идет не о комментировании, а не о сообщении кому либо кода ошибки


 
Dennis I. Komarov ©   (2011-07-28 11:52) [71]

"Ты что, дальтоник, Скрипач — зелёный цвет от оранжевого отличить не можешь?" (C)


 
sniknik ©   (2011-07-28 12:01) [72]

> Почему-то тут много спецов которые начинают опираться только на свой опыт, зашоренность мешает.
про него и спрашивали, опыт. ты еще "теме"? перечитай вопрос.

а не придуманные ситуации, которых в принципе не должно быть.

не "зашорен"? ну так приведи пример когда это РЕАЛЬНО необходимо.

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


 
sniknik ©   (2011-07-28 12:04) [73]

> ну так приведи пример когда это РЕАЛЬНО необходимо.
хотя... выдуманный пример в этой теме будет офтопиком. приводи реальный, из опыта... и не боись, мы тебя из-за этого в зашоренности обвинять не будем.


 
Игорь Шевченко ©   (2011-07-28 12:12) [74]

Предлагаю всем воюющим сторонам внимательно прочитать
http://delphikingdom.com/asp/viewitem.asp?catalogid=1392
после чего воевать с аргументами.


 
antonn ©   (2011-07-28 12:15) [75]


>
> а не придуманные ситуации, которых в принципе не должно
> быть.

[41] реальная ситуация


 
antonn ©   (2011-07-28 12:24) [76]

ладно, с позволения я тот пост сюда перенесу, чтобы на одной странице был и поближе:
Еще один примерчик: у меня программа строит списки, время от времени их пересчитывая, большие списки. И переодически сбрасывает кеш данных на диск. Если при запуске кеш окажется валидным то он будет загружен и пока будет идти перерасчет узер увидит данные за такое-то время сформированные (он и так вообще-то смотрит только данные кеша, который строится на этих вот больших списках, поэтому при старте программы кеш пустой и юзер смотрит в пустой экран).
Так вот мне глубоко пофиг почему не записался кеш, пофиг что там файл был занят, что было реад_онли, что винчестер сглючил или вообще пути для кеша не существует. Ну получу я код ошибки запрета записи на диск, и чего? юзеру это не нужно, а вполне вероятно он не сделает того о чем я его попрошу на основании этой ошибки (дать доступ на запись). А запишется кеш - ну и замечательно. Нет - переживем.

Поподробнее: в конфигурации программы указаны некоторые объекты (сервер pos-терминалов), программа загружает этот список серверов, коннектится на каждый, вытягивает списки самих pos-терминалов, опрашивает их, записывает результат обработки в результирующий список (путь будет list2). Переодически повторяет процедуру, сама она может занимать от 5 до 15 минут (в зависимости от кол-ва просматриваемых серверов).
Пользователь со стороны gui смотрит как раз результат обработки, причем работа с этой программой не является постоянной его деятельностью, а по необходимости (как раз для техподдержки, ага).
Этот list2 я иногда выгружаю в файловый кеш, дабы после перезапуска программы я мог загрузить этот кеш (если он валидный - по времени и структуре не "устарел") чтобы пользователь мог наблюдать результаты предыдущей проверки, а не смотреть в пустые окна ожидая пока пройдет первая обработка. Так вот этот пункт - не обязательный, и введен лишь как мелкое удобство для пользователя. Если я не смогу сохранить кеш - никто не умрет, пустой экран при перезапуске программы с уведомлением что идет перерасчет данных является нормальным. Однако если там что нибудь отобразится - хорошо.
Запись в файл идет в отдельном потоке, и этот поток никак не должен повлиять на работу сервиса в целом. Код ошибки мне не нужен, потому стоит try..except с пустой секцией обработки исключения.


 
sniknik ©   (2011-07-28 12:31) [77]

> Предлагаю всем воюющим сторонам внимательно прочитать
читал, и даже частично использую... могу дополнить - ексепты indy (не вдаваясь в обсуждение их самих) - EIdHTTPProtocolException, и ADO (если нужны полные "трассируюшие" ексепты от много командных скриптов) требуют особой обработки (по ссылке не разбирается) если хотим полную информацию, на ексепт с пустым месейджем например.

> [41] реальная ситуация
это не ситуация, это дурость, это ты почему то решил что юзеру не хочется видеть данные, а хочется смотреть в пустой экран. но как только кто-то обратится в поддержку с требованием "сделать нормально, вон у Васи все показывает", так поддержка тебя и проклянёт.


 
antonn ©   (2011-07-28 12:41) [78]


> это ты почему то решил что юзеру не хочется видеть данные,
>  а хочется смотреть в пустой экран.

а еще юзеру не хочется работать, хочется пить пиво и временами рыжую бабу.
по существу еще что нибудь есть что сказать?


> но как только кто-то обратится в поддержку с требованием
> "сделать нормально, вон у Васи все показывает", так поддержка
> тебя и проклянёт.
>

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


 
sniknik ©   (2011-07-28 12:58) [79]

> по существу еще что нибудь есть что сказать?
в службу поддержки тебя, на вразумление...

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


 
sniknik ©   (2011-07-28 13:00) [80]

вообще хорошие аргументы, если что, то "а мне это не нужно", хотя рассуждения до этого были глобальными, и советы тоже.


 
antonn ©   (2011-07-28 13:05) [81]

странный ты тип, я описал задачу и где в ней стоит пустая секция, а ты поливаешь водой, криво и язвительно пытаешься "съехать"...


 
sniknik ©   (2011-07-28 13:13) [82]

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


 
antonn ©   (2011-07-28 13:21) [83]


> ты описал задачу с "административным"(нежелание программиста
> работать нормально возведенное в ранг...) решением не использовать,
>  а не реальной "не нужности" по задаче.

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



Страницы: 1 2 3 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.71 MB
Время: 0.005 c
15-1311915862
И. Павел
2011-07-29 09:04
2011.11.20
Восстановление бекапа БД в другую БД


15-1311252880
Дмитрий С
2011-07-21 16:54
2011.11.20
Как можно так стремно делать программы в 21 веке?


15-1311884998
Юрий
2011-07-29 00:29
2011.11.20
С днем рождения ! 29 июля 2011 пятница


15-1311773579
xayam
2011-07-27 17:32
2011.11.20
C++ => Object Pascal


4-1252050878
Quazi
2009-09-04 11:54
2011.11.20
Создание собственной SPIN-блокировки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский