Я хотел бы обновить поток пользовательского интерфейса из потока, который я создал с помощью этой функции:
CreateThread
Вот мой код
[STAThread]
void Main(array<String^>^ args) {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
gRecvSockThread = CreateThread(NULL, 0, recvSocket, NULL, 0, NULL);
MyApp::MyForm form;
Application::Run(%form);
}
DWORD WINAPI recvSocket(void *arg) {
char recvbuf[8];
RtlZeroMemory(recvbuf, 8);
while (gSocket->getStateSocket() != -1) {
int iResult = recv(gSocket->getSocketFD(), recvbuf, 8, MSG_WAITALL);
if (iResult > 0) {
if (strcmp("accepted", recvbuf) == 0) {
//updateUIValidated(); //here I would like to access a label and make it visible for example..
}
else {
//updateUIRejected();
}
}
}
return 0;
}
Решено с помощью System::Threading;
вместо CreateThread
и создайте атрибут делегата.
Свяжите этот атрибут с методом, который обновит интерфейс:
delegateUpdateUI = gcnew UpdateUI(this, &MyForm::UpdateUIMethod);
И тогда в моей теме я звоню:
Invoke(delegateAcceptedUI);
И заканчивай 🙂
Других решений пока нет …