Russian Qt Forum
Ноябрь 22, 2024, 10:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 12 13 [14] 15 16 17   Вниз
  Печать  
Автор Тема: Igors, это ты? :)  (Прочитано 131961 раз)
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #195 : Декабрь 14, 2018, 11:38 »

Конечно могу, посмотрите любой пример из boost.asio использующий async функции. Ту же демку с таймерами. Он выполняется в одном потоке и это легко проверить в любом отладчике.

1.
ася то как раз мульти-поточная.

2.
под капотом системного епула так же много-поточный дизайн.

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

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


я решил, не комментировать далее голословные бла бла бла.





Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #196 : Декабрь 14, 2018, 11:46 »

Набросал вам пример с двумя таймерами, который работает в одном потоке.
Код
C++ (Qt)
#include <boost/asio.hpp>
#include <boost/chrono.hpp>
#include <iostream>
 
using namespace std;
using namespace boost::asio;
 
void onTimeout1( const boost::system::error_code &ec, deadline_timer &timer )
{
 if( ec == error::operation_aborted )
   return;
 
 cout << "Timer1 triggered" << endl;
 
 timer.expires_from_now( boost::posix_time::seconds( 3 ) );
 timer.async_wait( [&timer]( const boost::system::error_code &ec ){ onTimeout1( ec, timer ); } );
}
 
void onTimeout2( const boost::system::error_code &ec, deadline_timer &timer )
{
 if( ec == error::operation_aborted )
   return;
 
 cout << "Timer2 triggered" << endl;
 
 timer.expires_from_now( boost::posix_time::seconds( 10 ) );
 timer.async_wait( [&timer]( const boost::system::error_code &ec ){ onTimeout2( ec, timer ); } );
}
 
int main()
{
 cout << "Run demo" << endl;
 
 io_context io;
 deadline_timer timer1( io );
 deadline_timer timer2( io );
 
 onTimeout1( boost::system::error_code(), timer1 );
 onTimeout2( boost::system::error_code(), timer2 );
 
 io.run();
 
 return 0;
}
 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #197 : Декабрь 14, 2018, 11:51 »

1.
ася то как раз мульти-поточная.
asio мультипоточная, когда вам надо, а когда не надо - однопоточная. Улыбающийся

2.
под капотом системного епула так же много-поточный дизайн.
Ну конечно, ядро современных ОС мультипоточны, поэтому абсолютно все программы являются мультипоточными (даже Hello world) - ну ок. Улыбающийся

человек, который думает:
"да у меня всего один поток, за меня всю асинхронку ось реализовала, значит асинхронка возможна в одном треде" - тупой дебил.
Это человек который не знает, как работает периферия компьютера - тупой дебил. Улыбающийся
Я вам уже привел пример с uart, а еще есть прерывания, зеленые треды и т.д. Улыбающийся

я решил, не комментировать далее голословные бла бла бла.
Ну и правильно, сложно комментировать вещи о которых вы понятия не имеете. Улыбающийся

Новое поколение "специалистов", которые умеют нажать кнопочку в visual studio и дождаться появления окошка со своей прикладной программой. А что там в "компьютерах" происходит между нажатием и появлением считают магией. Улыбающийся
« Последнее редактирование: Декабрь 14, 2018, 11:55 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #198 : Декабрь 14, 2018, 12:04 »

а теперь правильный отве:

нет никакого  "отложенного вызова" в контексте асинхронки.

инициация выполнения процедуры задачи происходит сразу же
по факту вызова связанной с нею функции.

отложенным является факт получения результата выполнения задачи.
Ну хорошо, вот простейший пример
Код:
m_timerID = this->startTimer();
Рано или поздно я отдам упр-е и выйду в событийный цикл. По таймеру будет что-то делаться, напр читаться файл по частям. Да, в одном потоке это выполняется последовательно, обычно чередуясь с UI операциями, и что с того? Почему это нельзя считать "асинхронкой"? Упр-е возвращается сразу, блокировки нет, момент окончания задачи неизвестен. И какая мне разница "отложенный вызов" или "отложенный факт получения" ?

Ну и вообще.. неужели программистам не о чем поговорить, свалились уже в полную фигню. Грустно   Плачущий
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #199 : Декабрь 14, 2018, 12:08 »

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

Цитировать
Задержался мужик у любовницы и приходит домой очень поздно.
Жена:
— Где был, почему так поздно?
— Да вот, э-эээ...
— Опять, наверно, на партийном собрании задержался?
— А, да-да, конечно!
— А почему от тебя духами пахнет чужими?
— Да это, как его...
— Наверно, просто рядом на собрании сидели одни женщины?
— Ну да, конечно, дорогая!
— А чей это волос у тебя на костюме и след помады на шее?
— Да я, да...
— Наверно, давка была в автобусе, когда возвращался?
— О, да, да!
— Ну, ложись спать, дорогой.
Муж раздевается.
— Постой, а почему на тебе женские трусы?
— Маша, ну ты же умная женщина, ну придумай что-нибудь!

Молодец, отличная аргументация Улыбающийся. Сам себя отмазать не может, пущай другие этим занимаются Улыбающийся.
Записан

Пока сам не сделаешь...
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #200 : Декабрь 14, 2018, 12:46 »

Молодец, отличная аргументация Улыбающийся
если ты не веришь, например, документации boost::asio.
или, допустим, тебе из неё не вполне понятно, что такое "асинхронный дизайн",
и чем он отличается например, от "синхронного",
тогда можешь почитать мои сообщения выше.

я там его ну очень просто описал.
даже блондинка, третьекурсница медицинского факультета сможет понять.

Сам себя отмазать не может, пущай другие этим занимаются Улыбающийся.

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

правда заключается в том, что не считая твоих близких,
окружающему миру (людям) на тебя по большому счету наплевать.

Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #201 : Декабрь 14, 2018, 12:49 »

а теперь правильный отве:

нет никакого  "отложенного вызова" в контексте асинхронки.

инициация выполнения процедуры задачи происходит сразу же
по факту вызова связанной с нею функции.

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

Ну хорошо, вот простейший пример
Код:
m_timerID = this->startTimer();
Рано или поздно я отдам упр-е и выйду в событийный цикл. По таймеру будет что-то делаться, напр читаться файл по частям. Да, в одном потоке это выполняется последовательно, обычно чередуясь с UI операциями, и что с того? Почему это нельзя считать "асинхронкой"? Упр-е возвращается сразу, блокировки нет, момент окончания задачи неизвестен. И какая мне разница "отложенный вызов" или "отложенный факт получения" ?

С помощью ложного утверждения можно обосновать всё что угодно. Пример: утверждение «если дважды два равно пяти, то снег красный» является истинным. Парадокс импликации.

Осталось выяснить, чья исходная посылка "более правильная". Но это скорей всего скатится в вопрос веры и принятия/непринятие чужой веры. Если человек верит, что "инициация выполнения процедуры задачи происходит сразу же" (и, скорей всего в другом потоке, хотя в его же правильном отве про потоки не упоминается), то и пускай, значит в его мире такая вот асинхронность. У нас, получается, другая. Будем устраивать крестовые походы? Улыбающийся

Ну и вообще.. неужели программистам не о чем поговорить, свалились уже в полную фигню. Грустно   Плачущий

Дело тут уже не в программистах, а в человеческой натуре. Люди разные, таков наш мир Улыбающийся.
Записан

Пока сам не сделаешь...
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #202 : Декабрь 14, 2018, 12:56 »

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

правда заключается в том, что не считая твоих близких,
окружающему миру (людям) на тебя по большому счету наплевать.

Я ж говорю, молодец. Сказочный Улыбающийся.
Записан

Пока сам не сделаешь...
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #203 : Декабрь 14, 2018, 13:05 »

Да, в одном потоке это выполняется последовательно, обычно чередуясь с UI операциями, и что с того? Почему это нельзя считать "асинхронкой"?

потому что противоречит самой идее асинхронного дизайна:
"ты делай спокойно свои дела, а когда твой заказ будет готов, мы тебе позвоним"

то, о чем ты сейчас написал - это тупо синхронный последовательный императив.
причем, что самое забавное:
вызывать в каком то вечном цикле кучку маленьких функций - это имитация многопоточности.
многопоточности, Карл.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #204 : Декабрь 14, 2018, 13:12 »


сопрограммы ортогональны асинхронному программированию.
внезапно.

Сопрогораммы реализуются посредством тех же футур. Только вместо wait() не засыпаем на мьютексе а делаем longjump в эвентлуп. А при наступлении события делаем longjump обратно.
Мне точно надо приводить пример юзания футуры?
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #205 : Декабрь 14, 2018, 13:23 »

Сопрогораммы реализуются посредством тех же футур. Только вместо wait() не засыпаем на мьютексе а делаем longjump в эвентлуп. А при наступлении события делаем longjump обратно.

ортогонально - значит не имеют отношения к асинхронному программированию.

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

Мне точно надо приводить пример юзания футуры?

откуда ты взял это своё "точно"?
я что, дал тебе повод думать, что мне нужен пример юзания футуры?

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

вместо этого, зачем то начал переводить стрелки на футуры.
которые мало того, что прямиком эксплуатируют многопоточку,
так ещё и блокирующие к тому же.

« Последнее редактирование: Декабрь 14, 2018, 13:26 от _Bers » Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #206 : Декабрь 14, 2018, 13:26 »

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

Вот и корень заблуждений).

Вызывать в каком то вечном цикле динамически пополняемую кучку маленьких функций - это асинхронка.

Это асинхронка, а не многопоточность, Карл.
Асинхронка и многопоточность не тождественны, Карл.
« Последнее редактирование: Декабрь 14, 2018, 13:28 от ssoft » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #207 : Декабрь 14, 2018, 13:34 »

ортогонально - значит не имеют отношения к асинхронному программированию.

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


Обоже.

Код:
auto future = run(foo, arg1, arg2).then([](auto future2) {return run(bar, future2.get());}).then([](auto future3) { return run(baz, future3.get()); });
co_wait future;

если чо, подобное реализовано в как минимум одной компании.
run это аналог QtConcurrent::run только без тредпула и на тех же корутинах.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #208 : Декабрь 14, 2018, 13:36 »

Асинхронка и многопоточность не тождественны, Карл.

Кэп, залогинься.

Вот и корень заблуждений).
Это асинхронка, а не многопоточность, Карл.

бла бла бла.

ты можешь сказать: это - заблуждение потому что...
и далее расписать, как будет правильно.

голословные "бла бла бла" - не интересны.

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

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

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



Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #209 : Декабрь 14, 2018, 13:44 »

Обоже.

Код:
auto future = run(foo, arg1, arg2).then([](auto future2) {return run(bar, future2.get());}).then([](auto future3) { return run(baz, future3.get()); });
co_wait future;

я ничего не понял.
не понятно, это что такое вообще? псевдокод?
тогда где коментарии с описанием просходящего?

если это - фрагмент реального кода,
тогда почему нет полноценного примера-иллюстрации?
где хедера, функция main,
с ссылкой на онлайн компилятор?

вот так нужно грамотно оформлять пример-иллюстрацию:

https://rextester.com/VXCE86969

Код:
// future::wait
#include <iostream>       // std::cout
#include <future>         // std::async, std::future
#include <chrono>         // std::chrono::milliseconds

// a non-optimized way of checking for prime numbers:
bool is_prime (int x) {
  for (int i=2; i<x; ++i) if (x%i==0) return false;
  return true;
}

int main ()
{
  // call function asynchronously:
  std::future<bool> fut = std::async (is_prime,194232491);

  std::cout << "checking...\n";
  fut.wait();

  std::cout << "\n194232491 ";
  if (fut.get())      // guaranteed to be ready (and not block) after wait returns
    std::cout << "is prime.\n";
  else
    std::cout << "is not prime.\n";

  return 0;
}

и сразу становится ясно и понятно, как футур используется.

теперь по аналогии приведите пример-иллюстрацию для сопрограммы.

Записан
Страниц: 1 ... 12 13 [14] 15 16 17   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.148 секунд. Запросов: 23.