C # WinForms ScrollToCaret Багги? - PullRequest
       1

C # WinForms ScrollToCaret Багги?

0 голосов
/ 20 января 2012

Ошибка ScrollToCaret в WinForms?

У меня есть сервер, который обрабатывает сообщения, сервер, который разрешает связь в стиле IRC. Я работаю над графическим интерфейсом WinForms, который взаимодействует с сервером.

В графическом интерфейсе WinForms есть компонент, который выполняет чтение / запись в newtork. Этот компонент запускает поток для непрерывного чтения (получения) в сокете. Этот поток принимает делегат, который позволяет обрабатывать прочитанное сообщение сразу, а не помещать во внутреннюю очередь чтения, встроенную в компонент. Тогда у меня есть основная форма, которая показывает сообщения чата, полученные и отправленные, среди прочего. Сообщения чата хранятся в RichTextBox. Обновление журнала чата осуществляется методом основной формы:

private void UpdateChatWindow(string text)
{
    lock (rtxt_msgLog)
    {
        rtxt_msgLog.Text += Environment.NewLine + text;
        rtxt_msgLog.SelectionStart = rtxt_msgLog.Text.Length;
        rtxt_msgLog.ScrollToCaret();
    }
}

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

Если у меня открыто одно окно с графическим интерфейсом, msgLog обновляется нормально, прокручивается вниз. Focus () не является проблемой, так как RichTextBox никогда не находится в фокусе, как указано в свойстве Focused, которое всегда возвращает «false».

Звезды странности, когда я запускаю второй графический интерфейс и захожу на сервер. Я начинаю получать Error на первом графическом интерфейсе, который запускается, когда я выполняю отправку с него, в то время как второй графический интерфейс работает нормально - получает сообщение, отправленное с первого графического интерфейса, корректно прокручивается до нижней части msgLog. После того, как я отправил несколько сообщений в графическом интерфейсе ошибки, ошибка перестает возникать в первом графическом интерфейсе и переходит ко второму графическому интерфейсу. Теперь я получаю сообщение об ошибке при попытке отправить MSG на второй графический интерфейс. Пока все это происходит. Когда я отправляю сообщение о первом (теперь это не GUI с ошибкой), оба GUI прокручиваются так, как должны. Но когда я отправляю сообщение об ошибке в графическом интерфейсе ошибки, ни один из графических интерфейсов не прокручивается, но они получают сообщение.

Интересно, что Ошибка никогда не возникает при записи полученного сообщения в msgLog, в котором также используется метод UpdateChatWindow, запущенный из потока компонентов, о котором я упоминал в начале. Отправка инициируется в главной форме, поэтому отдельный поток от потока запускается сетевым компонентом чтения / записи.

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

Я видел что-то на этом сайте, что могло бы объяснить это. Является ли причина моей странности связана с: «Вы не можете напрямую выполнять операции пользовательского интерфейса из другого потока, кроме основного потока пользовательского интерфейса»

Или есть что-то еще?

  • ОБНОВЛЕНИЕ 1

По-видимому, в моей системе есть некоторые конфликты, WinXP SP2 64bit. Возможно, даже связано с моими многочисленными установленными средами .Net. Графический интерфейс работает без помех на моем ноутбуке WinXP SP3 32bit. Имейте 3 открытых окна, и все работают без нареканий. Как только я открываю графический интерфейс на своем компьютере разработчика, присоединяюсь к тому же серверу, на котором включены 3 графических интерфейса ноутбука, новый графический интерфейс получает эту ошибку, в то время как графический интерфейс ноутбука все еще в порядке. Напечатано в моей проблеме в Google, и по результатам видно, что это может быть проблема конфигурации системы, и выглядит так: (

...