Как я могу реализовать процесс блокировки в одном слоте, не останавливая графический интерфейс? - PullRequest
0 голосов
/ 21 января 2010

Допустим, у меня есть событие и вызвана соответствующая функция. Эта функция взаимодействует с внешним миром и иногда может иметь длительные задержки. Если функция ждет или зависает, мой пользовательский интерфейс будет зависать, а это нежелательно. С другой стороны, необходимость разбивать мою функцию на множество частей и пересылать сигналы - это долго и может разбить код на части, что затруднит отладку и станет менее читабельным, а также замедлит процесс разработки. Есть ли специальная функция в программировании, управляемом событиями, которая позволила бы мне просто написать процесс в одном вызове функции и позволить mainThread выполнять свою работу во время ожидания? Например, компилятор мог бы повторно распознать ключевое слово, затем реализовать возврат, а затем повторно генерировать сигналы, связанные с новыми слотами, автоматически? Почему я думаю, что это будет отличная идея;) Я работаю с Qt

Ответы [ 3 ]

1 голос
/ 21 января 2010

"Существует ли специальная функция в программировании, управляемом событиями, которая позволила бы мне просто записать процесс в одном вызове функции и позволить mainThread выполнять свою работу во время ожидания?"

Это был бы неблокирующий процесс.

Но ваш первоначальный запрос был: «Как я могу реализовать процесс блокировки в одном слоте, не останавливая графический интерфейс?»

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

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

1 голос
/ 21 января 2010

Ваши два варианта являются многопоточными или каким-то образом нарушают вашу функцию.

С многопоточностью кажется, что ваше идеальное решение было бы Qt::Concurrent. Если вся ваша обработка уже выполняется в одной функции и функция довольно автономна (не ссылается на переменные-члены класса), это будет легко сделать. Если нет, то все может стать немного сложнее.

Чтобы разбить вашу функцию, вы можете либо сделать это, как вы предложили, и разбить ее на разные функции, при этом разные части будут вызываться одна за другой, или вы можете сделать это более образным образом, но разбросанные вызовы позволят другая обработка внутри вашей функции. Я полагаю, что звонок по номеру processEvents() будет делать то, что вы хотите, но я давно не сталкивался с его использованием. Конечно, вы можете столкнуться с другими проблемами с этим, если вы не понимаете, что это может привести к повторному запуску других частей вашего класса (в ответ на другие события), поэтому вы должны рассматривать его почти как многопоточный в защите переменных, которые иметь неопределенное состояние во время вычислений.

0 голосов
/ 21 января 2010

Если вы хотите обработать событие GUI, начиная долгое выполнение задачи, и не хотите, чтобы GUI ожидал завершения задачи, вам нужно сделать это одновременно, создав поток или новый процесс. выполнить задание.

Вы можете избежать создания потока или процесса, если задача связана с вводом-выводом, и случайных обратных вызовов для обработки ввода-вывода будет достаточно. Я не знаком с основным циклом Qt, но я знаю, что GTK поддерживает добавление источников событий, которые могут интегрироваться в цикл типа select() или poll(), запуск обработчиков по истечении тайм-аута или когда готов дескриптор файла. Если у вас такая задача, вы можете заставить свой обработчик событий добавить такой источник событий в основной цикл приложения.

...