2017-05-27 101 views
0

我想更新從我用這個函數創建一個線程UI線程:更新UI從另一個線程的C++ Windows窗體應用程序

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; 
} 
+0

你能否解釋關於特定問題,你面對?比賽條件? –

+0

recvSocket是一個從線程執行的函數。從這個函數我想訪問ui線程,你可以在strcmp後看到我想updateUI,但我沒有訪問我的表單的按鈕... – DevAndroid

+0

你需要在你的窗體中使用一些公共函數使其可訪問。 –

回答

0

使用System::Threading;解決而不是CreateThread並創建委託屬性。 綁定的方法,此屬性將更新UI:

delegateUpdateUI = gcnew UpdateUI(this, &MyForm::UpdateUIMethod); 

,然後在我的線程我打電話:

Invoke(delegateAcceptedUI); 

,並完成:)

相關問題