Когда я пытаюсь скомпилировать простой сбой окна проекта SFML [дубликат]

Краткий ответ: ваш метод foo() возвращается немедленно, а вызов $ajax() выполняется асинхронно после возврата функции . Проблема заключается в том, как и где сохранить результаты, полученные при вызове async, после его возврата.

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

function foo(result) {
    $.ajax({
        url: '...',
        success: function(response) {
            result.response = response;   // Store the async result
        }
    });
}

var result = { response: null };   // Object to hold the async result
foo(result);                       // Returns before the async completes

Обратите внимание, что вызов foo() ] все равно не вернут ничего полезного. Однако результат асинхронного вызова теперь будет сохранен в result.response.

7
задан dargaud 5 December 2014 в 11:10
поделиться

2 ответа

ОК, я наконец нашел причину (благодаря кому-то в National Instruments), более эффективную диагностику и обходной путь.

Ошибка во многих версиях libxcb и является проблемой 32-разрядного опрокидывания счетчика который известен в течение нескольких лет: https://bugs.freedesktop.org/show_bug.cgi?id=71338

Не все версии libxcb затронуты libxcb-1.9 -5 имеет, libxcb-1.5-1 нет. Из списка ошибок 64-битная ОС не должна быть затронута, но мне удалось запустить ее хотя бы на одну версию.

Это приводит меня к лучшей диагностике. Следующая программа выйдет из строя менее чем за 15 минут в затронутых библиотеках (лучше, чем за всю неделю, которую она ранее взяла):

// Compile with: gcc test.c -lX11 && time ./a.out
#include <X11/Xlib.h>
void main(void) {
    Display *d = XOpenDisplay(NULL);
    if (d)
     for(;;)
        XNoOp(d);
}

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

6
ответ дан dargaud 24 August 2018 в 09:52
поделиться

У меня просто была программа, которая действовала точно так же, с точно таким же сообщением об ошибке. Я ожидал, что ошибка счетчика обработает события 2 ^ 32 до сбоя.

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

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

1
ответ дан camelccc 24 August 2018 в 09:52
поделиться