С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/19: Рейтинг темы: голосов - 19, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 46

SendMessage из потока

20.12.2013, 17:29. Показов 3826. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, почему то не приходят сообщения отправленные из потока функцией SendMessage

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DWORD __stdcall thread_start(LPVOID params)
{
   Sleep(5000);
   SendMessage(NULL,545,NULL,NULL);
   return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
   if (SUCCEEDED(OleInitialize(NULL)))
   {
        HANDLE        hr;
        DWORD         dwThreadId;
    hr = CreateThread(NULL,0,thread_start,NULL,0,&dwThreadId);
        
        MSG msg;
    while (GetMessage(&msg, NULL,0,0))
    {
        std::cout << "msg:" << msg.message << "\n";
        TranslateMessage(&msg);
        DispatchMessage(&msg);
     }
    }
}
Подскажите в чем проблема ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.12.2013, 17:29
Ответы с готовыми решениями:

SendMessage
Помогите правильно сформировать запрос для окна. Нужно повторить такое сообщение(смотрю в Spy++): message:0x00FF wParam:00000000...

SendMessage
Доброго времени суток, товарищи. Проблема такова, что не отправляется сообщение из dll главному процессу. Код с комментами ниже. LRESULT...

Управление объектами потока из другого потока
Доброго времени. Есть два потока, один GUI, второй рабочий - делает снапшоты открытых окон, сравнивает их, передаёт потоку GUI...

16
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.12.2013, 18:18
SendMessage нужен хэндл окна. Здесь окна нет, хэндла тоже нет.
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 46
20.12.2013, 20:26  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
SendMessage нужен хэндл окна. Здесь окна нет, хэндла тоже нет.
да приложение консольное и что не как нельзя из потока передать сообщение ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.12.2013, 21:35
Передать сообщение кому ?
Нужен адресат, т.е. окно. В приведенном коде окно отсутствует.

PostThreadMessage подойдет ?
Функция добавляет сообщение в очередь сообщений потока.
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 46
20.12.2013, 21:50  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Передать сообщение кому ?
Нужен адресат, т.е. окно. В приведенном коде окно отсутствует.

PostThreadMessage подойдет ?
Функция добавляет сообщение в очередь сообщений потока.
1. Передать сообщение из потока в главный поток.
2. Как я понял PostThreadMessage отправляет в очередь потока а мне нужно наоборот из потока в главный поток.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.12.2013, 21:58
PostThreadMessage ставит сообщение в очередь сообщений определенного потока.
Какого именно - задается первым параметром (через ID потока).
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 46
20.12.2013, 22:11  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
PostThreadMessage ставит сообщение в очередь сообщений определенного потока.
Какого именно - задается первым параметром (через ID потока).
Все равно чего то не выходит и не пойму в чем проблема, по сути все должно работать

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// ид потока
DWORD         dwThreadId;
 
DWORD __stdcall thread_start(LPVOID params)
{
   Sleep(5000);
   PostThreadMessage(dwThreadId,65456,NULL,NULL);
   return 0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
   if (SUCCEEDED(OleInitialize(NULL)))
   {
        HANDLE        hr;
    hr = CreateThread(NULL,0,thread_start,NULL,0,&dwThreadId);
        
        MSG msg;
    while (GetMessage(&msg, NULL,0,0))
    {
        std::cout << "msg:" << msg.message << "\n";
        TranslateMessage(&msg);
        DispatchMessage(&msg);
     }
    }
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.12.2013, 22:16
У Вас поток шлет сообщение сам себе.
Нужно в главном потоке получить свой ID (через GetCurrentThreadId), а
затем из второго потока слать в него сообщения, используя этот ID.
1
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 46
21.12.2013, 00:44  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
У Вас поток шлет сообщение сам себе.
Нужно в главном потоке получить свой ID (через GetCurrentThreadId), а
затем из второго потока слать в него сообщения, используя этот ID.
Спасибо.

Добавлено через 2 часа 5 минут
А если приложение консольное оно не имеет HWND ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.12.2013, 01:11
HWND - это хэндл окна. Получить его можно только создав окно.
Консольное приложение или оконное - не имеет значения.
Разница между консольными и оконными приложениями лишь в том, что
консольные сразу при создании получают (или наследуют) консоль, а
оконные - очередь сообщений. Но никто не мешает в консольном приложении
создать очередь сообщений, а в оконном - консоль.

Цитата Сообщение от Убежденный Посмотреть сообщение
Разница между консольными и оконными приложениями лишь в том, что
консольные сразу при создании получают (или наследуют) консоль, а
оконные - очередь сообщений.
В MSDN порядок создания очереди сообщений описан более точно:

About Messages and Message Queues
http://msdn.microsoft.com/en-u... 85%29.aspx
Queued Messages

The system can display any number of windows at a time. To route mouse and keyboard
input to the appropriate window, the system uses message queues.

The system maintains a single system message queue and one thread-specific message queue
for each GUI thread. To avoid the overhead of creating a message queue for non–GUI threads,
all threads are created initially without a message queue. The system creates a thread-
specific message queue only when the thread makes its first call to one of the specific
user functions; no GUI function calls result in the creation of a message queue.
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 46
21.12.2013, 01:44  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
HWND - это хэндл окна. Получить его можно только создав окно.
Консольное приложение или оконное - не имеет значения.
Разница между консольными и оконными приложениями лишь в том, что
консольные сразу при создании получают (или наследуют) консоль, а
оконные - очередь сообщений. Но никто не мешает в консольном приложении
создать очередь сообщений, а в оконном - консоль.



В MSDN порядок создания очереди сообщений описан более точно:

About Messages and Message Queues
http://msdn.microsoft.com/en-u... 85%29.aspx
Спасибо, с английским проблемы не очень понимаю смысл в msdn.
Так а все же как получить hwnd консольного приложения ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.12.2013, 12:47
Цитата Сообщение от em_larionov Посмотреть сообщение
Так а все же как получить hwnd консольного приложения ?
Создать окно. CreateWindow(Ex). Но зачем ?
Если для обмена данными между потоками, то в консольном
приложении лучше использовать другие механизмы.
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 46
21.12.2013, 14:41  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Создать окно. CreateWindow(Ex). Но зачем ?
Если для обмена данными между потоками, то в консольном
приложении лучше использовать другие механизмы.
Намекни пожалуйста какие механизмы ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.12.2013, 14:48
Выбор конкретного способа зависит от целей и задач, но использовать в
консольном приложении оконные сообщения - не самый лучший вариант,
Можно использовать, например, события (events).

Event Objects
http://msdn.microsoft.com/en-u... 85%29.aspx

Или выделить общий буфер, в который читать и писать из разных потоков,
уведомляя друг друга через events. А доступ синхронизируя через критические секции.

P.S. Без английского в программировании далеко не уедешь, так что советую подтянуть.
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 46
21.12.2013, 22:56  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Выбор конкретного способа зависит от целей и задач, но использовать в
консольном приложении оконные сообщения - не самый лучший вариант,
Можно использовать, например, события (events).
У меня в основном потоке консольного приложения запускаются IWebBrowser2 а он без приема оконных событий почему то не работает

C++
1
2
3
4
5
6
7
8
9
10
SUCCEEDED(OleInitialize(NULL);
 
IWebBrowser2* _pBrowser2;
CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,IID_IWebBrowser2, (void**)&_pBrowser2);
 
while (GetMessage(&msg, NULL,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
А второй поток слушает команды по сокету и должен их передавать в основной поток а основной поток открывает и закрывает браузеры.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
21.12.2013, 22:58
Цитата Сообщение от em_larionov Посмотреть сообщение
У меня в основном потоке консольного приложения запускаются IWebBrowser2 а он без приема оконных событий почему то не работает
Проверьте, изменится ли положение дел, если вместо OleInitialize
вызвать CoInitializeEx с параметром COINIT_MULTITHREADED.
0
0 / 0 / 0
Регистрация: 25.09.2012
Сообщений: 46
22.12.2013, 00:05  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Проверьте, изменится ли положение дел, если вместо OleInitialize
вызвать CoInitializeEx с параметром COINIT_MULTITHREADED.
Спасибо, работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2013, 00:05
Помогаю со студенческими работами здесь

winapi sendmessage
Прошу о помощи, обрабатываю WM_KEYDOWN, если пишу запятую то меняет на точку, case WM_KEYDOWN: { char sMSG ={0}; ...

SetDlgItemText и SendMessage
Собственно код: void Out(HWND hEdit) { SetDlgItemText(hEdit, EDIT2, &quot;123\r\n&quot;); SendMessage(hEdit, EM_SETSEL, TRUE,...

Аналог SendMessage
Есть ли аналог SendMessage , тк sm ждет когда выполнить код по отправленному сообщению. Если функция которая не ждет когда выполнится код....

Ускорить SendMessage
можно как либо ускорить и отчего зависит скорость SendMessage? PostMessage не успевает обработать, как перехожу к следующему действию.

PostMessage и SendMessage
В общем такая проблема.... отправляю сообщение: PostMessage (hWnd, 1001, 1, (LPARAM)&amp;cds); проходит.. пишу PostMessage (hWnd,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru