metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-01-22 10:36 pm

atof, strtod и локаль.

Внезапно: а вот как положено в коде на С конвертить строку в double, если мы точно знаем, что в строке десятичный разделитель ".", и точно знаем, что код будут запускать на системе с адовыми локалями, у которых разделитель "," типа русской, белорусской итд? В дотнете, как положено, есть функция с параметром для локали и инвариантная локаль InvariantCulture. А в олдскульно-кошерном C как? setlocale(LC_NUMERIC,"C"); чо-то не рекомендуют, говорят, не thread-safe.

[identity profile] tzirechnoy.livejournal.com 2012-01-22 09:35 pm (UTC)(link)
1) Вы используете трэды? Тогда мы летим к вам (злобные баги).
2) Мнение, что разделителем можэт быть запятая -- это ересь, посему setlocale(LC_NUMERIC, "C")
3) char *dot;
if ((dot = strchr(s, '.'))) {
*dot = *nl_langinfo(RADIXCHAR);
}

[identity profile] fas-tm.livejournal.com 2012-01-22 09:39 pm (UTC)(link)
А как без них писать GUI нормальное ? А долгоиграющие бэкграунд воркеры ?
Расскажите.

[identity profile] theiced.livejournal.com 2012-01-23 06:42 am (UTC)(link)
на лиспе же. я тебе уже раз триста говорил - то что ты не умеешь не значит что нельзя.

[identity profile] thedeemon.livejournal.com 2012-01-23 06:59 am (UTC)(link)
И как именно лисп делает "долгоиграющие бэкграунд воркеры" без потоков?

[identity profile] permea-kra.livejournal.com 2012-01-23 08:23 am (UTC)(link)
Лисп - не знаю, а вообще долгоиграющие бэкграунд воркеры нужно либо форкать, либо делать на языке с хорошей поддержкой конкурентности/акторов, типа эрланга, ghc - хаскеля, скалы и т.п. Имхо, разумеется.

[identity profile] thedeemon.livejournal.com 2012-01-23 08:36 am (UTC)(link)
Ок, теперь вспоминаем контекст - "нормальный GUI". Что там с гуем в эрланге?
Ну и форкнешь воркера, потом сиди организовывай IPC дабы его прогресс отобразить и результаты получить... Как взаимодействовать с воркером предполагается? И как выглядит для юзера форк гуевого приложения, кстати? Ну и потом, говорим GUI - подразумеваем винду, реже ios и андроид, реже MacOS, но уж совсем редко прочие юниксы. Как там у эрланга, ghc и скалы с iOS?

[identity profile] permea-kra.livejournal.com 2012-01-23 10:17 am (UTC)(link)
>Что там с гуем в эрланге ?
биндинги к ГТК из коробки. Подойдет?

>Как взаимодействовать с воркером предполагается?
Через mmap отдать - забрать результаты и через пайп/сокет/msg_queue читать диагностику/слать команды, благо такой функционал предоставляется по-моему везде.

>эрланга, ghc и скалы c ios ?
понятия не имею, я от яблочного мира бесконечно далек. На андроиде есть жаба, а скала - это жаба, так что скала на андроиде должна быть, но про остальное - просто не в курсе

[identity profile] thedeemon.livejournal.com 2012-01-23 10:39 am (UTC)(link)
Не, GTK только в линупсе годится. В других системах слишком чужеродно выглядит, да и весит нехило.

Если через общую память общаться, то нафик и форкать было. Разве что для большей стабильности. Только припоминаю, что мне регулярно удавалось в ХР синий экран сделать при общении моих процессов через расшаренную память. Система, конечно, не лучшая и не свежая, но все еще актуальная.

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

[identity profile] permea-kra.livejournal.com 2012-01-23 11:37 am (UTC)(link)
Gtk выглядит так, как ему скажут. Нехило весит любой гуи-тулкит, простите. Если в платформе предусмотрены java или .Net , то языков под них, в т.ч. уверенно хороших - дофига, при этом есть полный доступ к нативным возможностям платформы. Кложур (лисп) тот же. Писать при этом на жабе/шарпе совершенно не обязательно.

Именно для надежности. Приложение вообще надо распиливать на максимальное число изолированных задач, чтобы при необходимости резетить их без большого дизастера. Особенно предполагающие много фоновых вычислений.

[identity profile] thedeemon.livejournal.com 2012-01-23 12:06 pm (UTC)(link)
Я просто пошел на главную страницу скриншотов на gtk.org, а там такое. Для винды примеры чуть лучше, но местами странные шрифты и размеры контролов.

(no subject)

[identity profile] permea-kra.livejournal.com - 2012-01-23 12:14 (UTC) - Expand

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 12:25 (UTC) - Expand

(no subject)

[identity profile] permea-kra.livejournal.com - 2012-01-23 12:40 (UTC) - Expand

[identity profile] tzirechnoy.livejournal.com 2012-01-23 05:48 pm (UTC)(link)
>потом сиди организовывай IPC

Конечно, организовывай. А что, в трэдах оно без ITC делается? ORLY? И сколько секунд при этом проходит до разноса памяти в щепки?

[identity profile] thedeemon.livejournal.com 2012-01-23 06:31 pm (UTC)(link)
С разделяемой памятью да одним адресным пространством надо только синхронизацию аккуратно сделать, передача данных тривиальна. До разноса памяти - зависит от кривизны рук. Бывает и без разносов.

[identity profile] tzirechnoy.livejournal.com 2012-01-23 08:56 pm (UTC)(link)
Ну, а через pipe -- надо только передачу данных аккуратно сделать, синхронизацыя тривиальна.

При этом, кстати, сделать передачу данных в pipe так, чтобы она обычно работала, но иногда делала что-то не то -- достаточно нетривиально. Ну, в смысле, что это какие-то кондовые такие ошыбки, которых в нормальном случае будет видно быстро.
С трэдами -- всё, в общем-то, наоборот.

[identity profile] tzirechnoy.livejournal.com 2012-01-23 05:46 pm (UTC)(link)
Да похер на чом. Новичёк, укушэнный трэдами, умудрится сделать сеть дэдлоков и на хаскеле. С другой стороны, и на Си без трэдов писалась вполне обычная гуйня.

[identity profile] tzirechnoy.livejournal.com 2012-01-23 08:54 am (UTC)(link)
GUI нормальное писать на poll/select. А, или Вы в GUI-программе что-то там рассчитываете? Тогда мы летим к вам (добрые санитары).
Бэкграунд-воркеры надо запускать через fork+exec. Если беспокоит скорость обмена данными -- то можно использовать mmap() на один файл, но в общем это всё preliminary optimisation. И выигрыш от возможности размазать программу на 100500 нод кластера обычно гораздо большэ, чем выигрыш от отсутствия одного memcopy.

[identity profile] tzirechnoy.livejournal.com 2012-01-23 08:55 am (UTC)(link)
И да, то, что Вы дажэ какой-то простенький GUI не представляете как написать без трэдов -- как раз о вреде оных трэдов говорит лучшэ многих слов.

[identity profile] fas-tm.livejournal.com 2012-01-23 09:46 am (UTC)(link)
Простенький, не надо. Согласен.
Вот только нормальный современный GUI с динамическим обновлением и перерисовкой контролов написать нормально без секса в гамаке стоя почти нельзя. Вы наверное плохо представляете чего это такое.
Откройте в таск менеджере каком нибудь любой современный гуй и посчитайте количество потоков.

[identity profile] thedeemon.livejournal.com 2012-01-23 10:43 am (UTC)(link)
По идее, одного потока с очередью сообщений и кучки таймеров должно хватать. Вон, во флэше вообще потоков нет, а интерфейсный фреймворк Flex выглядит и программируется вполне современно.

[identity profile] fas-tm.livejournal.com 2012-01-23 10:59 am (UTC)(link)
В простейшем случае так и есть.
Но если у меня коммуникация с внешними софтами/устройствами, то даже логичнее вынести в отдельный поток прием/обработку. Мало того, очень часто сторонние API/SDK это тупо регламентируют, вот пример:
"void copyProgress(OmCopyProgress* progress)
Remarks
This can be called from another thread while the copy is in progress. Note that it may not count
linearly from one frame to the next because some tracks may be omitted if, for example, the media
contains embedded audio."

[identity profile] thedeemon.livejournal.com 2012-01-23 11:20 am (UTC)(link)
Для общения с внешним миром и многопоточными библиотеками да, потоки нередко нужны. Я про "GUI с динамическим обновлением и перерисовкой контролов". Обновление и перерисовку обычно в одном гуевом потоке делают.

[identity profile] permea-kra.livejournal.com 2012-01-23 11:40 am (UTC)(link)
Тогда воркер надо выносить в отдельный поток. Особенно если предусмотренны длинные файловые операции. Только за то, что в ворде нельзя работать одновременно с сохранение промежуточного результата на медленную флешку хочется убить аффторов.

[identity profile] thedeemon.livejournal.com 2012-01-23 11:53 am (UTC)(link)
И я о том же. Воркер в отдельном потоке, отрисовка его состояния - в основном.

[identity profile] tzirechnoy.livejournal.com 2012-01-23 05:54 pm (UTC)(link)
Ну, вот в ворде трэдов явно не один. И что, помогло это тем индусам, которые его дизайнили?

(no subject)

[identity profile] thedeemon.livejournal.com - 2012-01-23 18:34 (UTC) - Expand

[identity profile] tzirechnoy.livejournal.com 2012-01-23 05:53 pm (UTC)(link)
> то даже логичнее вынести в отдельный поток
> прием/обработку.

Если обработка не трубет затратов проца -- то нафиг не нужно. А если требует -- то отдельный поток или отдельный процэсс -- разница существенная, и не в пользу потока.

Второе вообще не понял -- да, много дятлов используют трэды. И что?

[identity profile] tzirechnoy.livejournal.com 2012-01-23 05:51 pm (UTC)(link)
>нормальный современный GUI с динамическим
> обновлением и перерисовкой контролов написать
>нормально без секса в гамаке стоя почти нельзя.

Подпишусь. Под всем предложэнием подпишусь! Современную GUI с динамическим хрентотам -- это по определению похожэ на секс стоя в гамаке!

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