Вызывать события в многопоточных классах? - PullRequest
1 голос
/ 27 августа 2009

Возникновение событий в многопоточных классах?

Я использую класс (обработчик геймпада), который использует множество дочерних потоков для проверки ввода с клавиатуры и т. Д. Затем он вызывает события в моей форме для сортировки необходимой реакции. Есть ли способ вызвать событие на та же нить, что и сам класс.

Ответы [ 3 ]

6 голосов
/ 01 сентября 2009

Самый простой ответ: «просто вызвать событие в текущем потоке». Форма должна обрабатывать события, а затем выполнять любые обновления потока формы, используя Control.Invoke.

Вот рекомендуемый способ обновления Label элемента управления __message из другого потока.

Добавьте следующий код в форму .

Delegate Sub SetTextDelegate(ByVal message As String)

Public Sub SetText(ByVal message As String)
    If __message.InvokeRequired Then
        Dim oCall As New SetTextDelegate(AddressOf SetText)
        Me.Invoke(oCall, New Object() {message})
    Else
        __message.Text = message
    End If
End Sub

Затем позвоните форму .SetText(<messageToDisplay>), где это необходимо.

Вы можете использовать методы Control.Invoke или Control.BeginInvoke. См. Control.InvokeRequired Свойство для получения дополнительной информации.

0 голосов
/ 01 сентября 2009

Как обрабатывать любое событие в потоке графического интерфейса, если событие могло быть вызвано из другого потока (извините за код C #, но его легко перевести):

void myEventHandler(object sender, EventArgs e) 
{
    if (this.InvokeRequired) 
    { 
        this.BeginInvoke(new MethodInvoker(delegate() { myEventHandler(sender,e); }));   
        return; 
    } 

    // write code to handle event here 

}

Альтернативный синтаксис:

if (this.InvokeRequired) 
{ 
    this.BeginInvoke((MethodInvoker)delegate
    {
       myLabel.Text = "What a great post";
    });
}
0 голосов
/ 27 августа 2009

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

Если это то же самое, что и ваш случай, то вам следует отправить сообщение на сервер сообщений UI.

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