Почему до сих пор в кросс-поточной операции не допустима ошибка с делегатом Invoke? - PullRequest
1 голос
/ 16 декабря 2011

У меня есть Приложение VC ++ 2008 Form с некоторым неуправляемым кодом связи с сокетом.Я хочу отобразить сообщение связи в форме.Чтобы избежать вышеуказанной ошибки, я добавил делегат метод и использовал вызов Invoke .Но я все еще получаю ошибку выше.Кто-нибудь может помочь мне исправить мой код?

Это заголовочный файл Form1 :

#pragma once

#include "SocketClientMgr.h"
class SocketClientMgr;

namespace SocketClientFormApp {

    public ref class Form1 : public System::Windows::Forms::Form
    {
    public:
        Form1(void)
        {
            InitializeComponent();
            updateHandler = gcnew ProgressHandler(this, &SocketClientFormApp::Form1::updateLogMsg);
        }
    protected:
        ~Form1()
        {
        }
    private:

#pragma region Windows Form Designer generated code

        void InitializeComponent(void)
        {
        }
#pragma endregion

///////////////////////////////////

    private: delegate void ProgressHandler(String^ msg);
    static ProgressHandler^ updateHandler;

    public: void appendMsg(String^ msg);
    public: void updateLogMsg(String^ msg);
};
}

Это файл Form1 cpp :

#include "stdafx.h"
#include "SocketClientForm.h"

using namespace SocketClientFormApp;

void Form1::appendMsg(String^ msg)
{
    updateHandler->Invoke(msg);
}

void Form1::updateLogMsg(String^ msg)
{
    msgDisplayBox->AppendText(msg);
}

Метод appendMsg () будет вызываться из другого класса в другого потока .

EIDT:

static ProgressHandler ^ updateHandler; static не должно быть и должно быть private

ошибка произошла в updateLogMsg () enter image description here

1 Ответ

2 голосов
/ 16 декабря 2011

Делегатский Invoke(args) просто выполняется в текущем потоке;вам нужен someControlInstance.Invoke(delegate, args) (довольно часто, "this.Invoke (...)"), который использует цикл сообщений для передачи вызова делегата в поток пользовательского интерфейса, избегая проблемы между потоками.

В равной степени;

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