2015-04-21 6 views
0

Когда я создаю окно с именем'A 'функцией CreateWindow, окно «A» перестает отвечать, но может нарисовать его, прежде чем он не ответит.Зачем создавать окно не отвечает?

Когда я нажимаю «Войти»

Sign In

unsigned __stdcall ThreadFunc(void *lParam) { 
    pMsgHead pmsgHead = new MsgHead; 
    while (RecvMsg(ConnectSocket,pmsgHead,sizeof(MsgHead))) { 
     switch (pmsgHead->dwCmd) { 
     case WM_SIGN_IN: 
      g_hMain=CreateWindow(szMainClass, L"A", WS_OVERLAPPEDWINDOW, 
       200, 200, 250, 500, 0, 0, hInst, nullptr); 
      ShowWindow(g_hMain, SW_SHOW); 
      UpdateWindow(g_hMain); 
      break; 
     case WM_BROADCAST: 
      //DrawText() 
      break; 
     } 
    } 
    _endthreadex(0); 
    return 0; 
} 

Но когда я нажимаю на кнопку «Зарегистрироваться», он будет работать.

Sign Up

 case IDB_SIGN_UP: 
      g_hSignUp = CreateWindow(szSignUpClass, L"Sign Up", WS_OVERLAPPEDWINDOW, 
       800, 200, 300, 300, 0, 0, hInst, nullptr); 
      ShowWindow(g_hSignUp, SW_SHOW); 
      UpdateWindow(g_hSignUp); 
      break; 
     case IDB_SIGN_IN: 
     { 
      TCHAR uname[20], psd[20]; 
      GetWindowText(g_hSignInuname, uname, 20); 
      GetWindowText(g_hSignInpsd, psd, 20); 
      pMsgHead pmsgHead = new MsgHead; 
      pmsgHead->dwCmd = WM_SIGN_IN; 
      wcscpy_s(pmsgHead->tszbuf, uname); 
      wcscat_s(pmsgHead->tszbuf, L","); 
      wcscat_s(pmsgHead->tszbuf, psd); 
      SendMsg(ConnectSocket, pmsgHead, sizeof(MsgHead)); 
      break; 
     } 

Я просто использовать в то время как цикл в функции GetMessage в главном потоке и RecvMsg в выше, я использую пошагово отлаживать программу, один поток будет ждать в

while(RecvMsg())
Главный поток будет работать 'break' в
case IDB_SIGN_IN:
, тогда верните 0, если я по-прежнему использую одноэтапную отладку, он не будет загружен «wuser32.pdb»

+0

Вы создаете это окно из другого потока (а не _main_ one)? Вы не можете ... –

+0

@Adriano: Нет такой вещи, как * основная * нить. – IInspectable

+0

@Inspectable Давайте назовем его _UI_ нитью, если вы предпочитаете или - лучше - нить, где hInst был создан. В общем, пользовательский интерфейс является однопоточным, поэтому поток _main_ является видом _simplification_. –

ответ

4

Вы создаете окно в потоке. Это означает, что окно имеет сходство с этим потоком. Сообщения отправляются в очередь сообщений о потоках. В потоке нет цикла сообщений, поэтому ничто не может реагировать на сообщения.

Исправление состоит в том, чтобы создать все ваши окна в основной теме. Вы должны отправить сообщение в главное окно, которое запрашивает ваше другое окно. Таким образом, вы убедитесь, что все ваши окна создаются с помощью основного потока пользовательского интерфейса.

+0

Поблагодарите вашу причину и хорошее мастерство для этого.-W- – HaibaraAi