LINUX.ORG.RU

Сообщения rival

 

Google запускает пилотную программу для Chrome OS

Работа над Chrome OS идет полным ходом. Google ищет пользователей, которые могли бы протестировать ее и оставить свои замечания по поводу того, каким образом можно было бы улучшить систему.

Каждый участник пилотной программы получит Cr-48 Chrome ноутбук. От участника ожидаются регулярное использование этого ноутбука и детальные отчеты.

Программа открыта для физических лиц, предприятий, школ, некоммерческих организаций и разработчиков, находящихся в Соединенных Штатах.
Кандидаты должны быть не моложе 18 лет.

Подробности

Перемещено post-factum из OpenSource

rival ()

Общение между клиентом и сервером

Клиент подключается к серверу, после чего периодически должен посылать сообщение «ping», на что сервер должен отвечать «pong». Если кто-то нарушает договоренность, соединение закрывается.
Соединение нужно для того, чтобы сервер мог посылать некоторые данные M клиентам в произвольный момент времени.
Проблема в следующем. Есть вероятность, что M будет отправлено в тот момент, когда клиент посылает «ping», в результате чего клиент может сначала получить M и оборвать соединение, так и не получив «pong».

Мое решение. После отправки «ping» ожидать «pong» некоторое время, обрабатывая все сообщения. Если за это время «pong» не был получен, то связь прерывается. Но почему-то мне это не очень нравится.

Как обычно решается такая ситуация?

rival ()

[Qt][S60] некорректная работа кода без dynamic_cast

Есть кусок кода, взятый отсюда:

bool QVideoFrame::map(QAbstractVideoBuffer::MapMode mode)
{
    if (d->buffer != 0 && d->data == 0) {
        Q_ASSERT(d->bytesPerLine == 0);
        Q_ASSERT(d->mappedBytes == 0);

        // Вот здесь программа, запущенная на телефоне, перестает отвечать
        d->data = d->buffer->map(mode, &d->mappedBytes, &d->bytesPerLine);

        return d->data != 0;
    }

    return false;
}
И он же, но слегка подправленный.
bool QVideoFrame::map(QAbstractVideoBuffer::MapMode mode)
{
    if (d->buffer != 0 && d->data == 0) {
        Q_ASSERT(d->bytesPerLine == 0);
        Q_ASSERT(d->mappedBytes == 0);

        // Отладка показала, что в d->buffer хранится именно QImageVideoBuffer
        QImageVideoBuffer *ivb = dynamic_cast<QImageVideoBuffer*>(d->buffer);
        if (ivb) {
            // а тут уже вызов проходит гладко
            d->data = ivb->map(mode, &d->mappedBytes, &d->bytesPerLine);
        }

        qDebug() << d->buffer << &(*d->buffer); // 0x62aab0 0x62aab0
        qDebug() << typeid(*d->buffer).name();  // приложение зависает

        return d->data != 0;
    }

    return false;
}

Адрес в d->buffer не меняется, то есть тот же, что и здесь:

QVideoFrame::QVideoFrame(const QImage &image)
    : d(new QVideoFramePrivate(
            image.size(), pixelFormatFromImageFormat(image.format())))
{
    if (d->pixelFormat != Format_Invalid) {
        d->buffer = new QImageVideoBuffer(image);
        qDebug() << d->buffer << typeid(*d->buffer).name(); // 0x62aab0 17QImageVideoBuffer
    }
}

Кто может объяснить мне такое поведение?

rival ()

RSS подписка на новые темы