Используйте C++ шаблонный класс CLI в C#

Я не верю в это. Все операции пользовательского интерфейса должны выполняться в первичном потоке приложения, который известен как поток пользовательского интерфейса в приложении с графическим интерфейсом. Является ли это событием нажатия кнопки ; движение мыши; прокрутки; рисовать и т. д., включая окно перемещения, эти операции помещаются в очередь в очереди сообщений приложений (вроде буфера FIFO, который Windows поддерживает для всех приложений), который должен обрабатываться потоком пользовательского интерфейса.

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

Точно так же, если где-то в вашем коде потока пользовательского интерфейса у вас есть Thread.Sleep(), то пользовательский интерфейс также будет зависать в течение того же периода.

Альтернативы

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

Таймеры

Также рассмотрите возможность использования Timer вместо Thread.Sleep() или его эквивалента в качестве альтернативы перемещению окна 100 раз в секунду. Обязательно используйте правильный таймер для приложений с графическим интерфейсом, поскольку .NET определяет, по крайней мере, четыре (4) я считаю, и не все являются подходящими по умолчанию (если в все) для приложений с графическим интерфейсом .

9
задан Autodidact 25 March 2009 в 13:27
поделиться

3 ответа

Я имею работу вокруг, объявляю дополнительный класс, наследовавшийся Number<int> класс. Этот класс теперь видим в C# и может быть инстанцирован.

public ref class MyInt32 : public Number<int>
{
};
12
ответ дан 4 December 2019 в 09:14
поделиться

Отражатель лежит немного здесь. Названием класса не является на самом деле Число <интервал>. Это - на самом деле 'Число <интервал>'. Заметьте одинарные кавычки. Они только видимы при просмотре имени типа с ildasm.

Я полагаю, что это сделано для создания типа несвязываемым на большинстве языков, поскольку у них нет способа понять, как на самом деле работает шаблон C++. Это делает его эффективно только видимым к компилятору C++, который является соответствующим, так как это - единственный компилятор MS, который на самом деле поддерживает шаблоны (шаблоны! = дженерики).

10
ответ дан 4 December 2019 в 09:14
поделиться

Если Ваша цель состоит в том, чтобы создать параметрический тип в C++ CLI и затем использовать тот тип от C#, я думаю, что необходимо создать универсальный тип, а не шаблонный тип (см. Блог Stan Lippman по причинам, почему оба метода существуют). Посмотрите здесь для получения информации о том, как создать универсальные типы в C++ CLI.

1
ответ дан 4 December 2019 в 09:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: