Что причина могла перерисовать проблемы о 64-разрядной перспективе, но не в 32-разрядном в.NET WInForms?

две вещи: во-первых, чтобы проверить тип чего-то более питонского для использования

   isinstance(t, int)

, но во-вторых, когда ваш код не работает.

Если вы оцениваете литерал, вы, скорее всего, получите ошибку имени, поскольку переменная нигде не определена. Однако, если вы введете «с», например, вы получите что-то странное полностью. Поскольку переменная c определена, вы не получите ошибку имени, но она все равно потерпит неудачу при приведении литерала 'c' к int.

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

, например, так.

    if re.match('(\d+(\.\d+)?)', a):
        try:
            t = eval(a)
            print(type(t))
        except (NameError, ValueError):
            pass
    elif a == 'q' or a == 'Q':
        break
    else:
        continue

    if isinstance(t, int):
        sum_i = sum_i + int(a)
        c = c + 1

    elif isinstance(t, float):
        sum_f = sum_f + float(a)
        c = c + 1
    else:
        print("Invalid data entered. Please enter a number to add or q/Q to quit. ")
8
задан Davy8 13 February 2009 в 20:59
поделиться

8 ответов

Это ужасно походит на эту проблему.

При изменении размеров окон в Windows Вы обычно получаете цепочку, где каждое окно получает a WM_SIZE обменивайтесь сообщениями и затем звоните MoveWindow() (или подобный) на его детях, которые в свою очередь получают a WM_SIZE и так далее. Я уверен, что.NET делает то же самое под покрытиями.

На x64 Windows ограничивает глубину этого вложения, и после определенного момента (12-15 вложенных окон), это просто не отправит WM_SIZE сообщения больше. Это ограничение, кажется, не существует на x86. Это ограничение влияет и на x86 и на код x64, работающий x64 версии Windows.

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

14
ответ дан 5 December 2019 в 08:55
поделиться

При использовании Windows Forms они могли бы относиться к вложенным проблемам ограничения о 64-разрядном Windows.

Детали здесь: http://www.feedghost.com/Blogs/BlogEntry.aspx?EntryId=17829

Таким образом...

Из источника MS, в Управлении. SetBoundsCore:

SafeNativeMethods.SetWindowPos(new HandleRef(window, Handle), NativeMethods.NullHandleRef, x, y, width, height, flags);

// NOTE: SetWindowPos causes a WM_WINDOWPOSCHANGED which is processed
// synchonously so we effectively end up in UpdateBounds immediately following
// SetWindowPos.
//
//UpdateBounds(x, y, width, height);

И из MSDN:

http://social.msdn.microsoft.com/forums/en-US/windowsuidevelopment/thread/25181bd5-394d-4b94-a6ef-06e3e4287527/

"Немного расследования показало, что Windows прекращает отправлять WM_SIZE, когда это достигает некоторого определенного уровня вложенности. Другими словами, это не отправит WM_SIZE в Ваши дочерние окна, при попытке изменить размер их при обработке WM_SIZE в родительских. В зависимости от ПОЛЬЗОВАТЕЛЯ stuff/updates/serivice упаковывает максимальный уровень вложенности, на котором он прекращает распространять WM_SIZE, может варьироваться от 15 до 31 и еще намного выше (эффективно недостижимый) под последним XP 32bit/sp2.

Но это все еще слишком мало под XP x64 и все еще некоторыми подобными ужасными вещами происходит с другими сообщениями под некоторыми сборками Vista.

Таким образом, это - конечно, ошибка Windows."

У Вас есть два варианта: любой уменьшает глубину Вашей иерархии управления (более идеальное решение) или иначе получает "зафиксированные" средства управления из каждого из системных, которые Вы используете, следующим образом:

public class FixedPanel : Panel
{
  protected override void SetBoundsCore( int x, int y, int width, int height, BoundsSpecified specified )
  {
    base.SetBoundsCore( x, y, width, height, specified );

    if( specified != BoundsSpecified.None )
    {
      if( ( specified & BoundsSpecified.X ) == BoundsSpecified.None )
      {
        x = Left;
      }
      if( ( specified & BoundsSpecified.Y ) == BoundsSpecified.None )
      {
        y = Top;
      }
      if( ( specified & BoundsSpecified.Width ) == BoundsSpecified.None )
      {
        width = Width;
      }
      if( ( specified & BoundsSpecified.Height ) == BoundsSpecified.None )
      {
        height = Height;
      }
    }

    if( x != Left || y != Top || width != Width || height != Height )
    {
      UpdateBounds( x, y, width, height );
    }
  }
}
3
ответ дан 5 December 2019 в 08:55
поделиться

Я думаю, что наиболее вероятной причиной этой проблемы является проблема перерисовки в Вашем приложении. Возможно, что существует тонкое сообщение окон, заказывая различие на 64 битах, которое выставляет эту проблему в Вашем коде.

Можно экспериментировать с этим путем выполнения следующего.

  1. Добавьте таймер к своему приложению.
  2. В конечном счете обработчик называет flakyControl. Обновление ()

Я устанавливал бы таймер на что-то долго как 5 секунд. Затем запустите приложение на Win64 и посмотрите, устраняет ли это проблему. Раз так затем наиболее вероятной причиной являются одни из Ваших средств управления, правильно не сигнализирует, что это делалось недействительным.

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

1
ответ дан 5 December 2019 в 08:55
поделиться

Я согласился бы с Gordon. Я видел проблемы, где совершенно новые 64-разрядные машины имели проблемы дисплея с программами, которые выглядели хорошо под 32-разрядным, но покажут нечетные проблемы о 64-разрядных машинах. Обновление к последним/рекомендованным драйверам почти всегда устраняло проблему.

0
ответ дан 5 December 2019 в 08:55
поделиться

Походит на проблему драйвера дисплея мне...

Попытайтесь обновить к последним драйверам и посмотрите, решает ли это проблему? Различием на 64/32 бита является, вероятно, отвлекающий маневр...

0
ответ дан 5 December 2019 в 08:55
поделиться

То, что можно запустить программу на виртуальной ОС без проблем, предполагает, что это - проблема драйвера, потому что (по крайней мере, в VirtualPC) видеокарта эмулирована. Это означает, что некоторые вещи, которые обычно обрабатывала бы видеокарта, теперь сделаны ЦП, и таким образом не взаимодействующий с графическим драйвером. Обратите внимание то, что я не эксперт по виртуализации, и я предполагаю, что слой виртуализации мог влиять на проблему другими способами.

0
ответ дан 5 December 2019 в 08:55
поделиться

Я полагаю, что это связано с вложенным HWND's числа в дереве. Я не знаю определенные детали, но были некоторые ограничения, установленные для вложенного HWNDs с 64 битами. Времена я видел, что он происходит, я работаю вокруг этого путем ронения из полной Vista Basic (или аэро) темы классику окон. В этой точке уходят проблемы.

Попытайтесь переключиться на классика, и если это разрешает его, посмотрите, можно ли сократить количество вложенного HWNDs.

0
ответ дан 5 December 2019 в 08:55
поделиться

Если вы используете решение BeginInvoke () описано в блоге MSDN , не забудьте отключить закрепление дочерних элементов элемента управления, который переопределяет OnSizeChanged (). У меня был Dock = DockStyle.Fill, и мне пришлось изменить его на DockStyle.None, чтобы исправление сработало.

1
ответ дан 5 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

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