Действительно ли возможно установить тайм-аут на сокете в Скрученном?

Если вы хотите добавить свой код в операторы отладки, вы можете проверить переменную среды:

void main () {
    if (Environment.get_variable ("G_DEBUG") == "fatal-criticals") {
        print ("Debug code\n");
    }
}

Опытный кодировщик предложил бы использовать отладчик для пошагового выполнения кода. Это означает, что вам не нужно добавлять дополнительные операторы только для отладки, но с Vala это немного сложно. Вот пример. Программа Vala:

void main () {
    var a = "before";
    var b = Test.run (a);
    print (@"$(b)\n");
}

namespace Test {
    string run (string a) {
        return "after";
    }
}

Компилировать с:

valac function_breakpoint_example.vala --debug -X -O0 --save-temps

--debug включает номера строк для кода Vala в сгенерированном C. -X -O0 передает -O0 в Компилятор C, поэтому информация не оптимизирована. --save-temps сохраняет временные файлы C, сгенерированные Vala, чтобы отладчик мог ссылаться на них.

Теперь запустите отладчик gdb:

gdb ./function_breakpoint_example
...enters gdb...
break test_run
run
# Program runs and then stops when Test.run is entered
step
# or `cont` if you want to continue on to the end of the program

Вам необходимо понять, как Vala преобразует имена своих символов в имена символов C. В этом примере используется пространство имен, поэтому Test.run преобразуется в функцию test_run в C. break test_run говорит GDB прекратить запуск программы при вызове этой функции.

Вы можете установить точку останова, используя номер строки в исходном файле, например,

break function_breakpoint_example.vala:9

Существует целый ряд команд для получения дополнительной информации, таких как трассировка полного стека или печать локальных переменных. info args покажет аргументы, переданные функции, p a покажет содержимое переменной a и info locals выведет локальные переменные. Некоторая напечатанная информация будет более понятной, чем другая.

Другой вариант, который снова добавляет операторы в ваш код, - это использование директивы Vala pre-parser. Это останавливает Vala, пропуская код через весь процесс компиляции, если условие не установлено. Например:

void main () {

#if DEBUG
    print ("debugging...\n");
#endif

}

при компиляции с:

valac pre_parser_directive.vala -D DEBUG

будет включать оператор print в сгенерированный C. Без -D DEBUG эта часть кода Vala не будет быть проанализирован и поэтому он не появляется в конечном выводе.

8
задан Jurassic_C 21 October 2008 в 12:56
поделиться

2 ответа

С тех пор Скрученный управляемо событиями, Вам не нужен тайм-аут по сути. Просто необходимо установить переменную состояния (как datagramRecieved), когда Вы получаете датаграмму и регистрируете вызов цикличного выполнения, который проверяет переменную состояния, останавливается, реактор при необходимости затем очищает переменную состояния:

from twisted.internet import task
from twisted.internet import reactor

datagramRecieved = False
timeout = 1.0 # One second

# UDP code here

def testTimeout():
    global datagramRecieved
    if not datagramRecieved:
        reactor.stop()
    datagramRecieved = False


l = task.LoopingCall(testTimeout)
l.start(timeout) # call every second

# l.stop() will stop the looping calls
reactor.run()
5
ответ дан 5 December 2019 в 08:01
поделиться

Я думаю reactor.callLater работал бы лучше, чем LoopingCall. Что-то вроде этого:

class Protocol(DatagramProtocol):
    def __init__(self, timeout):
        self.timeout = timeout

    def datagramReceived(self, datagram):
        self.timeout.cancel()
        # ...

timeout = reactor.callLater(5, timedOut)
reactor.listenUDP(Protocol(timeout))
13
ответ дан 5 December 2019 в 08:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: