Работа с контролами из другого потока

Тема в разделе ".NET", создана пользователем Hmarik, 12 июн 2008.

  1. Hmarik

    Hmarik Гость

    Есть окно.
    Хочу поменять текст в label из другого потока.
    Сделал вроде все как описано в MSDN.
    Один раз если открыть диалог и в нем менять все работает.
    Второй раз уже не работает (выскакивает исключение, что мол не безопасно все это).
    Пытался искать и отслеживать что работает не так... добавил в метод изменения текста строчку для отладки System.Diagnostics.Debug.WriteLine("SetText"); .. стало работать без исключений... и что за фигня спрашивается?... почему выскакивает исключение без этой строки?

    Проект прикреплен ...
     

    Вложения:

  2. Pasha

    Pasha Гость

    Ищи по форуму или в гугле Invoke/InvokeRequired.
     
  3. Hmarik

    Hmarik Гость

    Pasha
    Так вроде нашел.. и почитал.. и вроде в выше приложенном файле применил.. но есть то, что есть.... что описано выше.
     
  4. Pasha

    Pasha Гость

    Hmarik
    и на какой строчке в этом коде у тебя падает?
     
  5. Hmarik

    Hmarik Гость

    Pasha
    Вот на этой строчке this.labelText.Text = text;

    Как я и писал выше. Если один раз нажать на кнопку "Обновить", все проходит отлично.
    При втором нажатии пишет что это не безопасно.
    Если раскоментировать вот эту строчку //System.Diagnostics.Debug.WriteLine("SetText");, то все работает без предупреждений.
     
  6. Pasha

    Pasha Гость

    Проблема в том, что UpdateDB успевает начать работу быстрее, чем отработает m_formUpdate.ShowDialog. Поэтому в момент вызова InvokeRequired в SetText окно прогресса еще не создано, и InvokeRequired возвращает false. Вот, из msdn по InvokeRequired, секция Remarks:
    Чтобы решить мегапроблему, в потоке UpdateDB тебе нужно подождать создания окна перед тем, как начать работать с его контролами. Что-то типа:
    Код (Text):
    private static void UpdateDB(Object ob)
    {
    UpdateDBData updateDBData = (UpdateDBData)ob;

    while (!updateDBData.m_formUpdate.IsHandleCreated)
    {
    Thread.Sleep(0);
    }
    ...
     
  7. Hmarik

    Hmarik Гость

    Pasha
    Действительно, все логично... спасибо.
     
  8. WolfTheGrey

    WolfTheGrey Гость

    Отпешитесь пожалуйста где что и как можно почитать на русском языке по "InvokeRequired"

    Нужно из второго потока постоянно передовать данные в виндовс-форму
     
Загрузка...
Похожие Темы - Работа контролами из
  1. Andrey Kha
    Ответов:
    0
    Просмотров:
    19
  2. Hoasker
    Ответов:
    0
    Просмотров:
    64
  3. garri671
    Ответов:
    0
    Просмотров:
    52
  4. lelik200969
    Ответов:
    0
    Просмотров:
    50
  5. Kozolick
    Ответов:
    0
    Просмотров:
    136

Поделиться этой страницей