crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Асинхронная работа
xbarmaglot
  опции профиля:
сообщение 6.10.2012, 12:54
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 29.8.2012
Пользователь №: 3502

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

Если бы было синхронно, то работа примерно такая
    void func1()
    {
        result = invoke_method1();
        if (!result) return;
        ....
        result = invoke_methodN();
        if (!result) return;    
    }


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

А вот если работа асинхронная, то не понятно как обрабатывать результаты.
То есть invoke_method не возвращает результат, а от приходит, например, в другом слоте.

З.Ы. Не совсем понятно как быть, если выполнение функции - это последовательность из нескольких методов, которые должны последовательно отработать.
Как это будет выглядеть ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 7.10.2012, 13:48
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


если в общем, в принимающем слоте делается проверка - отсылали ли такой запрос, для которого пришёл ответ (а иногда проверка и не нужна). Маркировка- каким-нибудь уникальным в пределах сессии id
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xbarmaglot
  опции профиля:
сообщение 7.10.2012, 15:02
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 29.8.2012
Пользователь №: 3502

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 7.10.2012, 14:48) *
если в общем, в принимающем слоте делается проверка - отсылали ли такой запрос, для которого пришёл ответ (а иногда проверка и не нужна). Маркировка- каким-нибудь уникальным в пределах сессии id

Ну допустим, вызываем 1 метод
    void func1()
    {
        invoke_method1();
    }


в слоте пришел ответ
void my_slot()
{
     result = read_result();
}


Где вызывать metod2, если результат успешный?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 7.10.2012, 21:51
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Не совсем понял, но есть функция sender(), которая возвращает указатель на класс из которого был прислан сигнал в этот слот.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xbarmaglot
  опции профиля:
сообщение 7.10.2012, 21:54
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 29.8.2012
Пользователь №: 3502

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(RazrFalcon @ 7.10.2012, 22:51) *
но есть функция sender(), которая возвращает указатель на класс из которого был прислан сигнал в этот слот.

а чем она поможет ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 8.10.2012, 18:38
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(xbarmaglot @ 7.10.2012, 18:02) *
Где вызывать metod2, если результат успешный?

очевидно, что в my_slot() :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
xbarmaglot
  опции профиля:
сообщение 8.10.2012, 20:44
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 29.8.2012
Пользователь №: 3502

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 8.10.2012, 19:38) *
очевидно, что в my_slot()

этого я и боялся. Если методов десятки, а слот обработки результата один ?
Это такой крокодил получится, что разобраться в нем можно будет только один раз - при написании.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 9.10.2012, 7:38
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


да чего там разбираться то. Как спроектируешь систему, так и будет работать

Что именно смущает то ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 11.10.2012, 19:57
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(xbarmaglot @ 8.10.2012, 21:44) *
Цитата(Алексей1153 @ 8.10.2012, 19:38) *
очевидно, что в my_slot()

этого я и боялся. Если методов десятки, а слот обработки результата один ?
Это такой крокодил получится, что разобраться в нем можно будет только один раз - при написании.


А кто сказал что он должен быть один?
void func1()
{
    invoke_method1();
}


void my_slot1()
{
    result = read_result1();
    if (result)
        invoke_method2();
}

void my_slot2()
{
    result = read_result2();
    if (result)
        invoke_method3();
}

...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 21:36