Приложение Haxe+OpenFL зависает при использовании длительных циклов

Итак, вопрос в заголовке. Приложение зависает независимо от целевой платформы, когда я делаю длительные циклы. Сторонние циклы также приводят к зависанию:

var s:Socket = new Socket();
var data:String; 
s.connect(new Host("localhost"), 5000);
s.waitForRead();

Я не могу сделать даже простое приложение для сокетов, потому что его основная идея — использовать длительные циклы. Когда я не использую OpenFL, все идет нормально. Должен ли я вручную уменьшить загрузку процессора внутри цикла, и если да, то как я могу это сделать?


person Gulvan    schedule 20.09.2017    source источник
comment
Возможно, вы блокируете основной поток (и, следовательно, цикл игры/приложения) этим вызовом s.waitForRead()? Если это так, вы можете поместить этот код в отдельный поток или вообще избежать блокировки вызовов (путем опроса из других циклов или использования API на основе событий, если ваша целевая платформа их поддерживает).   -  person Jonas Malaco    schedule 20.09.2017
comment
@JonasMalacoFilho прав. Насколько я знаю, OpenFL имитирует 15-секундный предел циклов Flash.   -  person oli_chose123    schedule 21.09.2017


Ответы (1)


openfl.net.Socket — это, вероятно, то, что вы ищете — оно расширяет openfl.events.EventDispatcher и, таким образом, использует основанный на событиях API для обработки прослушивание/получение данных и т. д., чтобы их можно было использовать без блокировки основного потока.

Итак, пример настройки одного из них может выглядеть примерно так (взято из сообщение на форуме OpenFL)

socket.addEventListener(Event.CONNECT, onConnect);
socket.addEventListener(Event.CLOSE, onClose);
socket.addEventListener(IOErrorEvent.IO_ERROR, onError);
socket.addEventListener(ProgressEvent.SOCKET_DATA, onResponse);
socket.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecError);
trace("Connecting to server.");
socket.connect("52.36.8.250", 443);

Одна вещь, на которую следует обратить внимание, похоже, что параметр listener addEventListener равен Dynamic -> Void, поэтому использование значения, переданного в обратный вызов, может быть немного сложным.

person bsinky    schedule 21.09.2017