SendMessage & CreateThread

Discussion in 'WASM.WIN32' started by gevara, May 7, 2007.

  1. gevara

    gevara максим

    Blog Posts:
    0
    создаю поток:
    Code (Text):
    1. void Thread(PPARAMETRS pParametrs)
    2. {
    3.     SendMessage(GetDlgItem(pParametrs->hWnd,IDC_EDIT9),WM_SETTEXT,5,(LPARAM)"hello");
    4.         // или SetDlgItemText(pParametrs->hWnd,IDC_EDIT9,"hello");
    5. }
    6.  
    7. //...
    8.  
    9. CreateThread(0,0,(PTHREAD_START_ROUTINE)Thread,&pr,CREATE_DEFAULT_ERROR_MODE,0);
    В итоге всё это подвисает при выводе текста(функция SendMessage или SetDlgItemText не возвращает управления).

    Почему так происходит - ведь они работают в одном адресном пространстве. Как иначе вывести текст?
     
  2. q_q

    q_q New Member

    Blog Posts:
    0
    gevara
    Попробуй PostMessage/SendMessageTimeout вместо SendMessage.
    Мало информации, чтобы определить возможна ли взаимная блокировка.
     
  3. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    а какие действия идут параллельно в главном потоке? мало информации
     
  4. gevara

    gevara максим

    Blog Posts:
    0
    в главном потоке WaitForMultipleObjects (вообще предполагалось что потоков будет несколько, но я пока отрабатываю на одном). Я не думаю что причина в этом.

    Точнее я бы даже спросил так: может ли поток, созданный функцией DlgProc отправлять сообщение SendMessage?
    Если да - значит ошибка в коде. Причём код я перерыл - прогнал под олькой. хендл окна правильный.
     
  5. censored

    censored New Member

    Blog Posts:
    0
    gevara
    обычно обработка\отправлений сообщений окна происходят в том потоке, к-рый окно и создал.
     
  6. lamer2k

    lamer2k New Member

    Blog Posts:
    0
    PostMessage(GetDlgItem(pParametrs->hWnd,IDC_EDIT9),WM_SETTEXT,5,(LPARAM)"hello");

    так по идее программа должна продолжиться, не ожидая пока очередь сообщений окну будет обработана. Вродь у Рихтера что-то было на эту тему...
     
  7. ntcdm

    ntcdm New Member

    Blog Posts:
    0
    Если посылаешь месседж потоку который стоит по WaitForXXXObject то так и должно быть. Чтобы обработать твой месседж поток должен крутится внутри GetMessage/TranslateMessage/DispatchMessage.
     
  8. gevara

    gevara максим

    Blog Posts:
    0
    ERROR_MESSAGE_SYNC_ONLY (00000487)