Russian Qt Forum

Qt => Общие вопросы => Тема начата: ilnile от Сентябрь 30, 2013, 21:36



Название: Вопрос про функции
Отправлено: ilnile от Сентябрь 30, 2013, 21:36
Код:
int func1() {
    while(1)
        if (ok == 1) {
            return 1;
        }
}

Как реализовать подобный подход?
Мне нужно чтобы при выполнении функции она вернула результат по внешнему событию.
Это вообще возможно?


Название: Re: Вопрос про функции
Отправлено: Bepec от Сентябрь 30, 2013, 21:48
Функции - если только через глобальную переменную, способ ты сам написал. И только если многопоточное приложение. Ежели однопоточное - оно у тебя в этом цикле и умрёт.

Функция у тебя загрузит опупенно проц по идее :D

Класса - через сигнал-слоты спокойно.

 


Название: Re: Вопрос про функции
Отправлено: ilnile от Сентябрь 30, 2013, 21:52
Через сигнал слоты и было, но не очень удобно в моем случае
Я пишу данные в порт, получаю ответ, который попуждает к послед действиям.

что мне нужно
функция которая посылает в порт запрос, получает ответ и возвращает результат, но как это сделать если я могу послать из функции запрос в порт, а прочитать только по сигналу в другой функции и соответ-но не могу вернуть результат первоначальной функцией.
Как это можно реализовать?


Название: Re: Вопрос про функции
Отправлено: ilnile от Сентябрь 30, 2013, 21:55
По сути что мне надо
Код:
int func() {
данные > порт;
жду пока придет ответ
если пришел то
return ответ*10;
}



Название: Re: Вопрос про функции
Отправлено: mutineer от Сентябрь 30, 2013, 22:15
Это можно сделать через локальный QEventLoop. запускаешь его в своей функции и получаешь возможность обрабатывать сигналы. По нужному сигналу выходишь из лупа и попадаешь опять в свою функцию


Название: Re: Вопрос про функции
Отправлено: Igors от Октябрь 01, 2013, 08:38
что мне нужно
функция которая посылает в порт запрос, получает ответ и возвращает результат, но как это сделать если я могу послать из функции запрос в порт, а прочитать только по сигналу в другой функции и соответ-но не могу вернуть результат первоначальной функцией.
Как это можно реализовать?
С точки зрения событийной (event-driven) схемы работа func1 должна быть завершена как только она отдалась в порт. Неизвестно сколько времени ждать, какие еще есть события и.т.п. поэтому сидеть в func1 нехорошо. Если все делать в одной нитке, то нормальное решение - создать func2 принимающую результат из порта. Обычно в таких случаях неприятно то что все переменные что были готовы в func1 (контекст) утеряны в func2. Это не смертельно, придется сохранить контекст в func1. Да, это может быть большая структура, но запуск в др нитке или вторичный eventLoop не дешевле


Название: Re: Вопрос про функции
Отправлено: Serr500 от Октябрь 01, 2013, 08:39
что мне нужно
функция которая посылает в порт запрос, получает ответ и возвращает результат, но как это сделать если я могу послать из функции запрос в порт, а прочитать только по сигналу в другой функции и соответ-но не могу вернуть результат первоначальной функцией.
Как это можно реализовать?
Например, на мьютексах. Взводим мьютекс и посылаем запрос в порт, затем ждём освобождения мьютекса. Когда возникает внешнее событие, его обработчик разблокирует мьютекс и наша функция продолжит выполнение. Но внешнее событье должно ловиться в другом потоке, иначе получите deadlock (http://ru.wikipedia.org/wiki/%D0%92%D0%B7%D0%B0%D0%B8%D0%BC%D0%BD%D0%B0%D1%8F_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0). Вместо мьютекса можно использовать семафор. (Кстати, если мне не изменяет память, семафоры в Qt основаны на мьютексах...)