Как я могу приостановить функцию в C или Objective-C на Mac без использования сна () - PullRequest
1 голос
/ 04 августа 2009

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

Спасибо за ваши ответы. Хорошо, я начал код, ожидая некоторых ответов. Затем я понял, что сон или пауза не будут полезны для меня, потому что это освобождает всю мою программу. Я думаю, что, возможно, придется сделать некоторые потоки. Вот ситуация:

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

Надеюсь, меня не слишком смущает моё объяснение, но если я заболел, попробуйте в одной строке:

Я хотел бы взаимодействовать с моим интерфейсом какао, пока одна из моих функций остановлена ​​в середине того, что он делает.

Ответы [ 5 ]

3 голосов
/ 06 августа 2009

Мне кажется, что вы ищете -NSRunLoop runUntilDate:

Документы Apple: runUntilDate

Этот код вызовет приостановку выполнения в вашем методе, но все же позволит другим событиям, таким как таймеры и пользовательский ввод:

while ( functionShouldPause )
{
        [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}

Переключение functionShouldPause обратно на false позволит выполнить остальную часть метода.

2 голосов
/ 04 августа 2009

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

1 голос
/ 04 августа 2009

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

0 голосов
/ 21 апреля 2012

Нет ли функции часов или таймера? Когда ваша кнопка нажата, запустите цикл, подобный timeTillAction = 10, и выполните цикл timeTillAction = timeTillAction - 1, пока он не достигнет 0, затем запустите любой код через 10 секунд.

Извините, если это не очень хорошо объяснено.

0 голосов
/ 04 августа 2009

В C вы можете использовать функцию pause() в <unistd.h>. Это приводит к тому, что вызывающая программа приостанавливается до тех пор, пока не получит сигнал, после чего вызов pause вернется, и ваша программа продолжит (или вызовет обработчик сигнала; в зависимости от того, какой сигнал был получен).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...