unsigned long arg = 1;
ioctlsocket(sockfd, FIONBIO, &arg);
в Linux:
int arg = fcntl(sockfd, F_GETFL, NULL);
arg |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, arg);
или универсальная функция:
void setSockNonblock(int sockfd)
{
#ifdef WIN32
unsigned long arg = 1;
ioctlsocket(sockfd, FIONBIO, &arg);
#else
int arg = fcntl(sockfd, F_GETFL, NULL);
arg |= O_NONBLOCK;
fcntl(sockfd, F_SETFL, arg);
#endif
}
Занимаясь разработкой небольшой программы, использующей сокеты, потоки и не использующей фреймворков, типа Qt, столкнулся с необходимостью собрать это дело для Windows. Подводных камней оказалось много, как результат познакомился с такими милыми сущностями, как Boost.Thread и Boost.Asio.
Но тут вспомнилось, как мне уже приходилось собирать под Windows окружение, для компиляции исходников, использующих Boost и стало грустно. Грустно настолько, что оказалось проще сделать бинарники путём кросс-компиляции. И вот, когда дело было сделано, натыкаюсь на этот ресурс:
http://nuwen.net/mingw.html
Стефан (автор этого поделия) предоставляет сборку MinGW включающую сам компилятор, набор полезных библиотек (включая Boost 1.47.0!) и некоторых полезных утилит. Пакет не требует установки, просто распаковываем в c:
mingw и пользуемся.
Так что на будущее, буду пробовать.
Внезапно, правда? :)
Но волей судеб нужно было портировать программку, в которой использовался
nanosleep(2). И…
Для внезапно стало откровением: В WINDOWS НЕТ ТАЙМЕРОВ ВЫСОКОГО РАЗРЕШЕНИЯ. А есть только по сути хаки и вызов
Sleep, с минимальным промежутком в 10мс.
Наиболее часто рекомендуемый вариант:
void sleep_nsec(int64_t interval)
{
int64_t time1 = 0, time2 = 0, sysFreq = 0;
QueryPerformanceCounter((LARGE_INTEGER *) &time1);
QueryPerformanceFrequency((LARGE_INTEGER *) &sysFreq);
do
{
QueryPerformanceCounter((LARGE_INTEGER *) &time2);
} while(((time2-time1)*1000.0*1000.0/(double)(sysFreq)) < interval);
}
Но тут мы упираем процессор в полку. Есть вариант с использованием select, но, по отзывам, он так же может ждать не менее 10мс.
Т.е., по сути, это единственный вариант для Windows, да ещё и не лишённый глюков: почти все процессоры уже умеют автоматическое понижение частоты… Чуете? Пока работает цикл, значение sysFreq может измениться (поправьте меня, если я не прав) и время потекло.
Кроме того, наткнулся на статью:
http://www.codeproject.com/KB/system/timers_intro.aspx - Timers Tutorial
Описываются различные вариант таймеров: стандартные win32, мультимедийные, Waitable Timers (не знаю как лучше перевести на русский язык), Queue Timers. Но опять таки, все периоды - миллисекунды.
Сегодня пролетело в рассылке:
Hi,
Qt Creator master has recently got a feature, which has been requested a
few times, for Doxygen blocks generation. If you type /**
or /*!
and
press enter/return before a declaration, you’ll get something like:
/*!
*
* <br/>param data
* <br/>param options
* <br/>return
*/
QString generate(const Data &data, const Options &options);
You can also opt whether or not you want an additional <br/>brief
command
and leading asterisks for comment continuation (when breaking lines).
The options are in Text Editor->Completion->Documentation Comments.
Notice that the style is identified from the comment beginning. If you
start it with /*!
then the Qt style is used. Otherwise, the Java style
with the @
prefix for the commands is picked.
Cheers,
Leandro
Проверил - работает, удобно :)
Шаг 1. Взять sqlite-jdbc отсюда:
http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC или при помощи Maven (описание по той же ссылке)
Шаг 2. Положить у себя в проект класс SQLiteDialect, взятый отсюда:
http://arnoraps.tweakblogs.net/blog/3146/hibernate-with-sqlite.html или из архива отсюда:
http://code.google.com/p/hibernate-sqlite/ (HibernateSQLite.zip)
Шаг 3. В конфигурацию Hibernate добавить примерно следующее: ```xml
org.sqlite.JDBC
jdbc:sqlite:./data.db
ru.sincore.db.SQLiteDialect
…
На правах заметки:
- Список зависимостей для Maven, что бы получить последнюю (8.0.4) версию embedded Jetty и получить рабочий JSP.
- Конфиг для embedded Jetty, что бы завёлся JSP.
Подробности подкатом
Отличный, по моему мнению, туториал по Hibernate:
особенно хорошо показаны построения отношений между таблицами.
В последней Java6 не включена tzdata с информацией о том, что в России, сейчас нет перехода на зимнее время. Дальнейшие пояснения излишни.
Как фиксить? Обновить tzdata при помощи предлагаемой ораклом утилиты:
После очередного обновления, заметил, что Опера перестала стартовать. При запуске из терминала, вываливает следующее:
$ opera
(opera:13093): Gtk-CRITICAL **: IA__gtk_widget_unrealize: assertion `GTK_IS_WIDGET (widget)' failed
(opera:13093): Gtk-CRITICAL **: IA__gtk_widget_is_toplevel: assertion `GTK_IS_WIDGET (widget)' failed
opera [crash logging]: CRASH!!
/usr/lib/opera/opera got signal SIGSEGV at address B6B26E77
Log was created here:
/var/tmp/crash20111110210615.txt
Убито
Для столкнувшихся с этой же проблемой в ArchLinux:
Переехал на
BlogTNG вместо классической связки плагинов blog/tag/discussion. Разработчики, к слову, те же самые.
Уже пришлось малость залезть в исходники, для корректировки работы с тегами, но в целом ощущения положительные.
Теперь будем постепенно адаптировать другие части системы под новый блого-движок.
Как сказал один умный дядька (вот к своему позору запамятовал как его зовут, вроде Аристотель): “Дайте мне библиотеку и я в пустыне построю университет!”. Пусть у меня тут не университет, но… полезных и интересных книг? есть их у меня! Посему начинаю проект по публикации своей домашней электронной библиотеки. И вот первые ласточки:
материалы по учебе в ДВГТУ
Планирую сходить на Туманную в день шуток и приколов. Желающим присоединиться - в комменты.