Средство ожидания не отображается в приложении C # NET CF

#c# #compact-framework

#c# #compact-framework

Вопрос:

Я запускаю несколько длительный процесс в приложении C # .NET CF, затем я хочу показать указатель мыши в виде песочных часов. Код, который я использую, является:

 Cursor.Current = Cursors.WaitCursor;
Cursor.Show();
this.Refresh();

for (int nRow = 0; ... // lengthy process
{
    Program.tblLect.Rows[nRow]["rowId"] = nRow   1;
    // tried with this, doesn't work either
    //if ((nRow % 20)==0) 
    //    Application.DoEvents();
}

Cursor.Current = Cursors.Defau<
  

но курсор не отображается в форме.

Есть идеи?

Комментарии:

1. Мне кажется, все в порядке. Интересно, зависит ли это от устройства. Наш показывает круг с меняющимися цветами (не песочные часы).

2. Внешний вид средства ожидания зависит от операционной системы; для операционных систем поколения Windows XP и старше это песочные часы. для поколения Vista и новее обычно это синий / зеленый круг.

3. Выполняется ли это в потоке пользовательского интерфейса или в фоновом потоке?

4. @KeithS — это Compact framework, поэтому он работает на встроенном устройстве, а не на XP или Vista

5. @ctacke: это выполняется в потоке пользовательского интерфейса. Я попытался с другим потоком, как было предложено @Polity, но этот поток обновляет DataTable и столкнулся с проблемами параллелизма

Ответ №1:

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

Комментарии:

1. Я попытался с другим потоком, но на этот раз я обновляю DataTable в фоновом потоке и столкнулся с проблемами параллелизма

2. я бы рекомендовал исправить проблемы с параллелизмом, а не пытаться найти способ обойти эту проблему, потому что я не думаю, что будет много решений, кроме постоянного вызова Application. DoEvents или, что еще хуже, используйте таймер, чтобы разбить вашу длительную проблему на несколько более мелких частей (тьфу)

3. процесс на самом деле не является длительной проблемой, просто массивным обновлением данных. У меня нет проблем с использованием Application. Выполняйте события и / или поток. Режим ожидания, но у меня ни то, ни другое не работает (курсор не отображается). Может быть, существует глобальная настройка, которая скрывает курсор?

4. Переход в спящий режим в любом случае работать не будет, поскольку это также блокирует поток. Опять же, приложение. DoEvents может работать, но отображение и анимация курсора не является атомарной операцией и сильно зависит от базовой реализации. Короче говоря. Просто нет причин ожидать взаимодействия пользователя в режиме реального времени при использовании потока GUI для тяжелых операций.

Ответ №2:

Вместо курсора.Текущее использование

это.Current = Курсоры.Средство ожидания;

это.Курсор = курсоры.По умолчанию;