Windows Forms: потокобезопасный доступ к GUI? - PullRequest
1 голос
/ 05 августа 2011

в последние часы я боролся с делегатами и доступом к элементам управления Windows Forms (C ++), где я использовал этот учебник (первый потокобезопасный метод): http://msdn.microsoft.com/en-us/library/ms171728.aspx#Y190

Изменение TextBoxes и Labels работаетотлично, но когда я хочу показать или скрыть весь графический интерфейс из другого потока, это не удается.

Я использую следующий метод (который является частью класса GUI):

System::Void UI::showUI(boolean value) {
    if (this->InvokeRequired) {    
        SetTextDelegate^ d = gcnew SetTextDelegate(this, &UI::showUI);
        this->Invoke(d, gcnew array<Object^> { value });
    } else {
        if (value == true)
            this->Show();
        else
            this->Hide();
    }
}

В первом вызове выражение if истинно, поэтому вызывается Invoke.Но обычно метод showUI должен вызываться автоматически второй раз, когда предложение if возвращает false, но этого не происходит.Таким образом, графический интерфейс не отображается и не скрывается.

Нужно ли показывать / скрывать GUI с делегатом или я могу сделать это из всех возможных потоков?Если необходим делегат, почему showUI не выполняется во второй раз?

Спасибо, Мартин

edit: ладно, имя SetTextDelegate не подходит, но это не главное ...

1 Ответ

2 голосов
/ 05 августа 2011

Это довольно стандартный случай тупика, не редкость с Control :: Invoke ().Это может продолжаться, только если поток пользовательского интерфейса не занят.Используйте Debug + Windows + Threads и дважды щелкните по основному потоку.Посмотрите на стек вызовов, чтобы увидеть, что он делает.Типичным случаем является то, что он блокируется, ожидая, пока поток завершит работу.Этого никогда не произойдет, поскольку поток не может завершиться, пока не будет возвращен вызов Invoke ().

Не блокируйте поток пользовательского интерфейса.

Рассмотрите возможность использования BackgroundWorker, его событие RunworkerCompleted хорошо делатьвещи после завершения потока, устраняя необходимость в блокировке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...