Re[3]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: m2user  
Дата: 06.07.25 01:15
Оценка:
ВМ>>за пределами куте, они нигде не используются
ВМ>>щарп не просто язык
ВМ>>там и гуи насколько я понимаю

wl.>так сигналы это не только GUI — асинхронная работа сети та же, но тут, конечно, ASIO тоже не часть стандарта С++


Что касается асинхронной работы с сетью: в C# есть 3 паттерна разработки асинхронных API: TAP, EAP, APM (https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/).

Из них на event`ы полагается EAP (Event-based Asynchronous Pattern).
https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/event-based-asynchronous-pattern-overview#examples-of-the-event-based-asynchronous-pattern
  пример
public class AsyncExample  
{  
    // Synchronous methods.  
    public int Method1(string param);  
    public void Method2(double param);  
  
    // Asynchronous methods.  
    public void Method1Async(string param);  
    public void Method1Async(string param, object userState);  
    public event Method1CompletedEventHandler Method1Completed;  
  
    public void Method2Async(double param);  
    public void Method2Async(double param, object userState);  
    public event Method2CompletedEventHandler Method2Completed;  
  
    public void CancelAsync(object userState);  
  
    public bool IsBusy { get; }  
  
    // Class implementation not shown.  
}

Идея EAP в том, что об окончании работы асинхронного метода пользователь API узнает через подписку на event.
Как можно заметить, то же самое можно было организовать через передачу callback`а в асинхронный метод (что паттерне APM и делается).

Отдельно отмечу, что в случае необходимости вызова подписчика event`а в другом потоке, ответственен за это сам разработчик (хотя для этого и предлагаются вспомогательные классы).
См. https://learn.microsoft.com/en-us/dotnet/api/system.componentmodel.asyncoperationmanager?view=net-9.0#remarks

If your class needs to provide asynchronous behavior according to the Event-based Asynchronous Pattern Overview, you will encounter a number of concurrency management issues.
Among these is the requirement to ensure that event handlers are called on a thread or context that is appropriate for the application model (for example, Windows Forms applications, ASP.NET applications, console applications, and so on). The AsyncOperationManager provides a convenient way to create a class that runs properly under all application models supported by the .NET Framework.

См. https://learn.microsoft.com/en-us/dotnet/standard/asynchronous-programming-patterns/component-that-supports-the-event-based-asynchronous-pattern#implementing-the-completion-method

The completion delegate is the method that the underlying, free-threaded asynchronous behavior will invoke when the asynchronous operation ends by successful completion, error, or cancellation.
This invocation happens on an arbitrary thread.

This method is where the client's task ID is removed from the internal collection of unique client tokens. This method also ends the lifetime of a particular asynchronous operation by calling the PostOperationCompleted method on the corresponding AsyncOperation.
This call raises the completion event on the thread that is appropriate for the application model. After the PostOperationCompleted method is called, this instance of AsyncOperation can no longer be used, and any subsequent attempts to use it will throw an exception.

Re[7]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: m2user  
Дата: 06.07.25 10:08
Оценка:
M>Ещё раз, как я понял, делегат в шарпе — это прежде всего список чего-то вызываемого. Что может быть вызываемым — это второй вопрос.

Возможно ты имеешь в виду то, что к делегатам одного типа (сигнатуры) применим операторы +/- (они же методы Combine/Remove класса Delegate).
И результатом сложения является т.н. multicast делегат того же типа (сигнатуры), но при его вызове будут последовательно вызваны все слагаемые.

M>Тип возврата и аргументы, как я понимаю, должны соответствовать тому, что содержит event и что он возвращает


собственно event и определяется через тип делегата.

M> (но тут не понятно, если обработчиков много, результат которого из них вернётся туда, где было инициированно событие?)


типовая имплементация эвента в C# не предполагает, что обработчик что-то возвращает.

M>А то, что ты привел, это типы обработчиков события, которые могут быть присвоены делегату (а на самом деле добавлены в список вызовов)


ну да, делегат это и есть тип (и определяется сигнатурой функции, как std::function<>). То что делегаты можно складывать и вычитать, вызывать как функции, а также использовать как объекты класса Delegate это всё синтаксический сахар и compiler generated code.
Re[4]: а почему Qt-шные сигналы/слоты не вносят в стандарт C++?
От: Skorodum Россия  
Дата: 07.07.25 11:07
Оценка:
Здравствуйте, velkin, Вы писали:

V>А про то, что на Qt код нужно не писать, а попросту использовать и так понятно, но и производительности как в обобщённом программировании не жди. Я когда писал про if и switch намекал, что Qt как бы не пытается в производительность. И сигналы и слоты это довольно тормознутая штука сочетающая генерацию кода и очереди. Вот потому она и не попадёт в стандарт именно из Qt.

Генерация кода производительности времени выполнения совершенно ортогональна.
Про тормознутость сильно спорное утверждение: Qt-шный COW + Qt-шные сигналы/слоты на самом деле дают производительность которая покрывает, как минимум, 80% потребностей. Далеко не все программисты напишут сходный функционал с заметно лучшей производительностью, а, те, кто такинапишут потрят на порядки больше времени.

V>А даже если и захочет, то появилось куча мусорной литературы. Я бы даже сказал так, поколение программистов пользователей может даже не понимать, что у них в образовании имеются некие проблемы, да и не для всех это действительно проблемы.

Конечно, как и другие категории программистов могут не понимать паттернов использования фреймворка.
qt
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.