我有一个 VC ++ 2008表单应用程序,带有一些非托管套接字通信代码。我想在表单上显示通信消息。为了避免上述错误,我添加了委托方法并使用了调用调用。但我仍然犯了错误。有人可以帮我纠正我的代码吗?
这是 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:
静态ProgressHandler ^ updateHandler; 静态不应该在那里,它应该是私有
updateLogMsg()发生错误
答案 0 :(得分:2)
委托人Invoke(args)
只在当前线程上运行;你需要someControlInstance.Invoke(delegate, args)
(很常见,“this.Invoke(...)”),它使用消息循环将委托调用传递给UI线程,避免了跨线程问题。
同样;