C++ cli 如何在system::thread中编辑控件。

C++ cli 如何在system::thread中编辑控件。,c++-cli,C++ Cli,我需要能够添加项目到一个线程内的列表框。代码如下: 1. ref class Work 2. { 3. public: 4. static void RecieveThread() 5. { 6. while (true) 7. { 8. ZeroMemory(cID, 64); 9. ZeroMemory(message, 256); 10. if(recv(sConnect, message, 256, NU

我需要能够添加项目到一个线程内的列表框。代码如下:

1. ref class Work
2. {
3. public:
4.  static void RecieveThread()
5.      {
6.      while (true)
7.      {
8.          ZeroMemory(cID, 64);
9.          ZeroMemory(message, 256);
10.         if(recv(sConnect, message, 256, NULL) != SOCKET_ERROR && recv(sConnect, cID, 64, NULL) != SOCKET_ERROR)
11.         {
12.             ID = atoi(cID);
13.             String^ meep = gcnew String(message);
14.             lbxMessages->Items->Add(meep);
15.             check = 1;
16.         }
17.     }
18. }
19. };
我得到了错误

错误:非静态成员引用必须与第
14行上的特定对象相对。

有没有办法让我这样做?因为如果我尝试使用
String^meep在该线程之外,它不包含任何内容。当我在线程内使用它,而不是在线程外使用它时,它工作得非常完美。我需要能够将该消息添加到列表框中。如果有人能提供帮助,我将不胜感激。

您没有说明如何定义lbxMessages,但我将假设它是同一类中的非静态数据成员。如果是这种情况,则需要指定要访问的对象。最简单的方法是将ReceiveThread方法切换为非静态,然后您可以访问
this->lbxMessages


您没有说明正在使用哪个窗口工具包,但可能需要重新调用UI线程才能编辑控件。

一种方法是使用System::thread和ParameterizedThreadStart委托,该委托允许您传递对象,在本例中为LBXMessage

ParameterizedThreadStart^ threadCallback;
threadCallback = gcnew ParameterizedThreadStart(&Work::ReceiveThread);
Thread^ recvThread = gcnew Thread( threadCallback );
recvThread->Start( lbxMessages );
运行线程的静态方法:

static void RecieveThread(Object^ state)
{
    ListBox^ lbxMessages = (ListBox^)state;
    //...code
}
但是。还有一个问题。假设ListBox是Win32控件,则只能从创建它的线程更改控件。因此,每次插入ListBox项时,都必须从UI的线程执行。一种方法是使用对象

//启动线程
数组^args=gcnew数组(2){
LBX消息,
SynchronizationContext::当前
}
recvThread->Start(args);
线程方法应该是这样的:

static void RecieveThread(Object^ state)
{
  array<Object^>^ args = (array<Object^>^)state;
  ListBox^ lbxMessages = (ListBox^)args[0];
  SynchronizationContext^ ctx = (SynchronizationContext^)args[1];
  //...code
     String^ meep = gcnew String(message);
     ctx->Send(gcnew SendOrPostCallback(&Work::SafeListBoxInsert),
               gcnew array<Object^>(2){lbxMessages, meep}
     );
}
static void receivethread(对象^state)
{
数组^args=(数组^)状态;
列表框^lbxMessages=(列表框^args[0];
SynchronizationContext^ctx=(SynchronizationContext^)参数[1];
//…代码
字符串^meep=gcnew字符串(消息);
ctx->Send(gcnew SendOrPostCallback(&Work::SafeListBoxInsert),
gcnew数组(2){lbxMessages,meep}
);
}
您需要从UI的线程调用另一个方法并进行更改

ref class Work{
  //...other methods
  static void SafeListBoxInsert(Object^ state)
  {
    array<Object^>^ args = (array<Object^>^)state;
    ListBox^ lst = (ListBox^) args[0];
    String^ item = (String^) args[1];
    lst->Items->Add(item);
  }
}
ref课堂作业{
//…其他方法
静态无效SafeListBoxInsert(对象^state)
{
数组^args=(数组^)状态;
ListBox^lst=(ListBox^)参数[0];
字符串^item=(字符串^args[1];
lst->项目->添加(项目);
}
}
ref class Work{
  //...other methods
  static void SafeListBoxInsert(Object^ state)
  {
    array<Object^>^ args = (array<Object^>^)state;
    ListBox^ lst = (ListBox^) args[0];
    String^ item = (String^) args[1];
    lst->Items->Add(item);
  }
}