Я вообще то думал, что Вы вспомните libaio — и уже собирался понасмехаться, но не судьба :-)
А можно не насмехаться, а нормально рассказать в чем проявляются его недостатки и почему такое критическое мнение насчет этого?
Спрашиваю совершенно серьезно.
А зачем вам миниатюрность и низкое энергопотребление для теплицы и соленоидных вентилей? Там же и места должно быть полно и электричество будет. Всяко соленоиды будут жрать больше центральной микросхемы
Ну там далеко не теплица — обычный участок.
Электричество есть, но может и пропасть (такое бывает). Если не будет электричества не будет и воды (смысл держать вентили автономными отпадает), так что питать автономно надо только сам компьютер — для того, чтобы сообщить о перебоях в питании (тоже по СМС). Тогда нужно будет придти и полить вручную.
Насчет миниатюрности, все просто: мелкое проще спрятать. Не нужно будет искать большой погодозащищенный корпус, а потом думать куда его деть, чтобы никто не спер. Вообще конечно миниатюрность не главный критерий, но она была бы плюсом.
В-главных, слишком мелкая, даже дырочки «половинного» шага, надо будет паять проводочки.
Это не проблема. Во-первых у меня есть штырьковые разъемы для такого шага. Во-вторых ничего страшного, если придется паять.
Во-вторых, не видно 1-wire, I2C и прочих протоколов, не понятно есть ли аналоговые входы (входы с АЦП). Термометры на 1-wire очень популярны.
Это все не нужно. Нужно только замыкать и размыкать цепь. GPIO с этим справится вполне. Единственное что нужно будет дополнительно — это датчик напора воды.
Давно вынашиваю идею сделать автоматизированную систему полива в оранжерее и на дачном участке, с удаленным управлением по СМС и собственным автоматическим расписанием (которое можно было бы редактировать через веб-интерфейс). Учитывая малые размеры, достаточную производительность, наличие GPIO (для управления соленоидными вентилями) и похоже достаточно низкое энергопотребление, данный девайс как раз подошел бы в качестве мозга всей системы. Вообще именно отсутствие приемлемого вычислителя для этой задачи и останавливало. А тут, стало быть, такой хороший, на мой взгляд, вариант.
Я бы сказал, что программисту на любом языке полезно изучать другие технологии, в том числе те, которые применяются в других областях индустрии. Это выводит уровень решения задач на принципиально новый.
Минусуют за то, что не различаете компилятор и IDE.
И это, в CodeBlocks используется GCC. А значит сам редактор тут не при чем.
PS. я минусов не ставил.
1) Это да. Передача через event`ы эту проблему решает.
2) Я не считаю это проблемой, все равно интерфейс, определенный в MyThread будет привязан к конкретной задаче. Класс на практике называться будет соответственно этой задаче (а не MyThread). С другой стороны этот способ точно так же довольно просто поддаётся шаблонизации. Поэтому, если уже очень хочется, можно придумать нечто обобщённое на этой базе.
К слову сказать с более ранних версиях Qt event based межпоточное взаимодействие было основным способом. Т.к. во-первых поток не имел своей встроенной очереди сообщений, как в Qt4-Qt5, а во-вторых система сигналов не поддерживала межпоточные соединения. Приходилось делать свою очередь сообщений внутри run и проектировать систему событий для потока. Зато можно было передавать в основной поток события с помощью функции postEvent (собственно сейчас так тоже можно).
В журнале DrDobbs помню статью (к сожалению ссылку найти не могу), в которой показывались приемы работы с многопоточностью в Qt.
Одна из концепций такова (демонстрационный пример):
class MyThreadImpl
: public QObject
{
Q_OBJECT
public:
MyThreadImpl();
public slots:
void doStuff()
{
// impl...
emit onSomeStuff();
// impl
}
signals:
void onSomeStuff();
};
class MyThread
: public QThread
{
Q_OBJECT
public:
void doStuff()
{
emit doStuffImpl();
}
signals:
// external
void onSomeStuff();
// internal
void onStuffImpl();
private:
void run()
{
MyThreadImpl threadImpl;
// signal to thread
connect(this, SIGNAL(onStuffImpl()), &threadImpl, SLOT(doStuff()));
// signal from thread
connect(&threadImpl, SIGNAL(onSomeStuff()), this, SIGNAL(onSomeStuff()));
exec();
}
};
Со своей стороны нахожу данный подход одним из самых удачных для Qt и всем его рекомендую. Функции типа moveToThread считаю костылями, призванными исправлять существующие архитектурные косяки в проекте. Использовать их для новых решений ИМХО не стоит.
Аналогичный, более классический пример с использованием QEvent, который несколько более многословен, однако дает лучшую производительность.
while и for помимо своей цикличности вносят еще и область видимости. Это особенно важно для С++. Поэтому если и использовать goto, то с фигурными скобками:
int main ()
{
loop:
{
printf("1\n");
}
goto loop;
}
Получается даже немного длинее. Нет, все-таки в этом случае право большинство: for и while — лучше.
Хрень говорил. Геморрой — суть болезнь от плохого кровообращения. То есть сидишь ты весь день на заднице, застой крови образуется — как следствие — геморрой. У велосипедистов такого быть не может — ибо мышцы ягодичные всегда в тонусе. Да и массаж от седла неплохой.
Как раз таки не через Си-код. А в обход его. Задача во-первых не допустить попадания в Си-код исключений и нарушения контракта. Во-вторых оставить для пользователя библиотеки возможность их генерировать (в моем случае неизбежно, потому что код уже написан).
Смысл «протаскивания» в том, что обработка исключения должна быть в том месте, где это нужно. Если переносить всю обработку в код враппера — это будет прямое нарушение инкапсуляции. Враппер просто не может знать об особенностях клиентского кода.
А можно не насмехаться, а нормально рассказать в чем проявляются его недостатки и почему такое критическое мнение насчет этого?
Спрашиваю совершенно серьезно.
Ну там далеко не теплица — обычный участок.
Электричество есть, но может и пропасть (такое бывает). Если не будет электричества не будет и воды (смысл держать вентили автономными отпадает), так что питать автономно надо только сам компьютер — для того, чтобы сообщить о перебоях в питании (тоже по СМС). Тогда нужно будет придти и полить вручную.
Насчет миниатюрности, все просто: мелкое проще спрятать. Не нужно будет искать большой погодозащищенный корпус, а потом думать куда его деть, чтобы никто не спер. Вообще конечно миниатюрность не главный критерий, но она была бы плюсом.
Это не проблема. Во-первых у меня есть штырьковые разъемы для такого шага. Во-вторых ничего страшного, если придется паять.
Это все не нужно. Нужно только замыкать и размыкать цепь. GPIO с этим справится вполне. Единственное что нужно будет дополнительно — это датчик напора воды.
Он говорил про разные translation unit, а не про множественные включения в один.
Поправлюсь, не поддерживала до версии 2012, насколько я могу судить. Однако все еще работает не корректно в некоторых случаях.
Сорри за оффтоп :)
не совсем так. Скажем, частично проверка аргументов производится при специализации, и в некоторых других случаях.
Ну да ладно, собственно это не важно. Rust хороший язык, надеюсь найдется время познакомиться с ним поближе.
В С++ тоже. Это называется two-phase name lookup. Не смотря на то, что Visual Studio не поддерживает его, он все еще остается требованием стандарта.
womble.decadent.org.uk/c++/template-faq.html#two-phase
— Совковая лопата говно, я весь участок штыковой перекопал, очень удобно! 5 лет до этого копал совковой, ну и извращенцы же ее придумали!
Заканчивайте с этим, короче. Эмоции в инженерии — лишнее дело.
И это, в CodeBlocks используется GCC. А значит сам редактор тут не при чем.
PS. я минусов не ставил.
2) Я не считаю это проблемой, все равно интерфейс, определенный в MyThread будет привязан к конкретной задаче. Класс на практике называться будет соответственно этой задаче (а не MyThread). С другой стороны этот способ точно так же довольно просто поддаётся шаблонизации. Поэтому, если уже очень хочется, можно придумать нечто обобщённое на этой базе.
К слову сказать с более ранних версиях Qt event based межпоточное взаимодействие было основным способом. Т.к. во-первых поток не имел своей встроенной очереди сообщений, как в Qt4-Qt5, а во-вторых система сигналов не поддерживала межпоточные соединения. Приходилось делать свою очередь сообщений внутри run и проектировать систему событий для потока. Зато можно было передавать в основной поток события с помощью функции postEvent (собственно сейчас так тоже можно).
Одна из концепций такова (демонстрационный пример):
Со своей стороны нахожу данный подход одним из самых удачных для Qt и всем его рекомендую. Функции типа moveToThread считаю костылями, призванными исправлять существующие архитектурные косяки в проекте. Использовать их для новых решений ИМХО не стоит.
Аналогичный, более классический пример с использованием QEvent, который несколько более многословен, однако дает лучшую производительность.
Получается даже немного длинее. Нет, все-таки в этом случае право большинство: for и while — лучше.
Смысл «протаскивания» в том, что обработка исключения должна быть в том месте, где это нужно. Если переносить всю обработку в код враппера — это будет прямое нарушение инкапсуляции. Враппер просто не может знать об особенностях клиентского кода.