нужна помощь в потоках пользовательского интерфейса в C ++ - PullRequest
0 голосов
/ 12 февраля 2011

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

Когда я добираюсь до этой строки:

this->PostThreadMessage(WM_MYTHREADMESSAGE,0,0);

Я получаю следующее сообщение:

"Ни один символ не загружен ни для одного кадра стека вызовов. Исходный код не может быть отображен"

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

Ответы [ 2 ]

3 голосов
/ 13 февраля 2011

Вопрос сложный для понимания. Я предполагаю, что вы проходите через программу в отладчике, и вы попадаете на эту строку PostThreadMessage.

Если вы выберете Step Into, отладчик попытается войти в вызов PostThreadMessage (или оболочку фреймворка в зависимости от типа this). Поскольку PostThreadMessage является системным вызовом, вероятно, у вас нет символов для этого кода. Отладчик просто покажет вам разборку. Вы можете попробовать использовать сервер символов Microsoft, но я не вижу особого смысла пытаться проследить в PostThreadMessage. Если параметры верны, он отправит сообщение в очередь указанного потока. Не так много, чтобы увидеть там.

Отправка сообщений в другие темы - дело сложное. Большинство программ Windows, даже многопоточных, обычно хранят всю работу пользовательского интерфейса в одном потоке. Это может быть сделано, но есть много предостережений, и это обычно не стоит боли.

2 голосов
/ 13 февраля 2011

Итак, есть пара вещей:

  1. если вы хотите уведомить поток пользовательского интерфейса из рабочего потока, то вам не следует использовать PostThreadMessage, , вот почему .
  2. Когда this->PostThreadMessage(...) вызывается в функции-члене потока A, сообщение будет отправлено в поток A, поскольку this указывает на CWinThread из A. Вы должны получить указатель на другойпоток, чтобы отправить ему сообщение.
  3. Наконец, если вы хотите уведомить свой поток пользовательского интерфейса, используйте PostMessage, чтобы отправить сообщение в окно, созданное этим потоком.Добавьте соответствующий обработчик к карте сообщений окна.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...