Форум программистов, компьютерный форум CyberForum.ru

Поток с GetMessage - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
01.09.2012, 10:15     Поток с GetMessage #1
Привет всем. У меня в программе в отдельном потоке имеется такой код:
C++
1
2
3
4
5
while(GetMessage(&msg,0,0,0) 
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
Из основной программы я запускаю этот поток и программа останавливается на нём, хотя она должна продолжить выполняться дальше.
В чем моя ошибка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
01.09.2012, 11:01     Поток с GetMessage #2
Покажи весь код
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
01.09.2012, 11:02  [ТС]     Поток с GetMessage #3
C++
1
_beginthread(Messages,0,0);
вот так я запускаю поток

Сам поток:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void Messages(void *param)
{
    MSG msg;
    while(true) 
    {
                //Тут как-то нужно получить сообщение из очереди. 
                //GetMessage работать не хочет
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    _endthread();
}
И да, я разобрался с запуском потока, но как там получить сообщение из очереди? Мне в сторону хуков?
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
01.09.2012, 11:32     Поток с GetMessage #4
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
while(true)
у тебя в коде нет ни единого способа выйти из этого бесконечного цикла,так что всё правильно
по какому словию у тебя должен быть выход из цикла?
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 11:40     Поток с GetMessage #5
RaiaNKnight, а что насчет обычного цикла ?
C++
1
2
3
4
5
while (GetMessage(&msg, NULL, 0, 0))
    {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
    }
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
01.09.2012, 13:11  [ТС]     Поток с GetMessage #6
Цитата Сообщение от alexey31415 Посмотреть сообщение
у тебя в коде нет ни единого способа выйти из этого бесконечного цикла,так что всё правильно
по какому словию у тебя должен быть выход из цикла?
Черт, там я внизу написал, я решил эту проблему. Теперь всё норм с циклом.

Другая проблема, как получать сообщения от консоли в отдельном потоке?

Добавлено через 51 секунду
Цитата Сообщение от nexen Посмотреть сообщение
RaiaNKnight, а что насчет обычного цикла ?
C++
1
2
3
4
5
while (GetMessage(&msg, NULL, 0, 0))
    {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
    }
Да-да, именно так и сделал

Просто через CreateThread почему с таким циклом, как у вас, зависало.

Вот,кстати, с таким циклом у меня никак сообщения в функции WndProc, отвечающей за их обработку, не обрабатываются

Как будто бы, GetMessage не работает в другом потоке

msg.hwnd пустым остается, хотя я кликаю например правой кнопкой по консоли
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 13:41     Поток с GetMessage #7
RaiaNKnight, а зачем ты вообще message loop засунул в отдельный поток?
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
01.09.2012, 13:51  [ТС]     Поток с GetMessage #8
Цитата Сообщение от lazybiz Посмотреть сообщение
RaiaNKnight, а зачем ты вообще message loop засунул в отдельный поток?
Ну суть такая: у меня в отдельной процедуре есть цикл, который используется для постоянной записи звука.
Мне же нужно как-то постоянно контролировать сообщения из трея, например, щелчок правой кнопкой мыши на иконке вызовет контекстное меню

Поэтому я могу сделать это при помощи цикла в отдельном потоке. Затолкать же саму процедуру для записи звука в отдельный поток геморно
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 13:56     Поток с GetMessage #9
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Затолкать же саму процедуру для записи звука в отдельный поток геморно
Зато правильно. А почему геморно?
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
01.09.2012, 14:12  [ТС]     Поток с GetMessage #10
Там довольно большое число параметров, хотя я думаю, вы правы. Сейчас попробую

Добавлено через 1 минуту
Скажите, а вот эта программа должна ведь работать:
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
27
28
29
30
31
32
33
34
#include <Windows.h>
#include <iostream>
using namespace std;
 
LRESULT WINAPI WndProc(HWND hwnd, UINT msg, LPARAM lParam, WPARAM wParam)
{
    switch (msg)
    {
    case WM_RBUTTONDOWN:
        {
            MessageBoxW(GetConsoleWindow(),L"qweqweqw",L"qweqweqeqweq",MB_OK);
            break;  
        }
    case WM_QUIT:
        {
            PostQuitMessage(0);
            break;
        }
    default:
        DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
 
int main()
{
    MSG msg;
    while(GetMessage(&msg,NULL,NULL,NULL))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}
Просто у меня даже здесь обработка не идет
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 14:18     Поток с GetMessage #11
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
а вот эта программа должна ведь работать:
Нет. GetMessage обрабатывает сообщения окна(окон), а у тебя его нет. Необходимо зарегистрировать класс и создать окно.
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
01.09.2012, 14:19  [ТС]     Поток с GetMessage #12
А консольное не годится никак вообще?
Значит я и в потоке смогу ловить сообщения потом?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 14:27     Поток с GetMessage #13
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
А консольное не годится никак вообще?
Для консольного не нужна процедура окна. Тебе вообще нужно окно?
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Значит я и в потоке смогу ловить сообщения потом?
Так ты без окна и класса это делать пытался? В потоке тоже должно работать, только это как-то не правильно получается.
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
01.09.2012, 14:31  [ТС]     Поток с GetMessage #14
У меня всё так:
Консольное приложение(Win32). В консоли некотор-е данные выводятся.

А какая процедура тогда нужна - мне нужно ведь обрабатывать сообщения?

В качестве окна я думал, что можно использовать HWND от GetConsoleWindow(), а про класс я не знал
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 14:47     Поток с GetMessage #15
А какие тебе нужно обрабатывать сообщения?
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
01.09.2012, 14:56  [ТС]     Поток с GetMessage #16
Сообщение от иконки этого же приложения в системном трее
alexey31415
 Аватар для alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
01.09.2012, 16:43     Поток с GetMessage #17
попробуй передавать из главного потока сообщения вторичному при помощии SendMessage,используя хэндл потока
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 17:29     Поток с GetMessage #18
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Сообщение от иконки этого же приложения в системном трее
Для этого нужно создать окно. В таких случаях его делают маленьким и невидимым.
Цитата Сообщение от alexey31415 Посмотреть сообщение
попробуй передавать из главного потока сообщения вторичному при помощии SendMessage,используя хэндл потока
Можно поподробней ?
RaiaNKnight
 Аватар для RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 458
Записей в блоге: 1
01.09.2012, 18:01  [ТС]     Поток с GetMessage #19
Т.е. мои действия:
1)Регистрирую класс
2)Создаю окно, не смотря на то, что у меня уже есть консоль
3)Пишу функцию WndProc, отвечающую за обработку сообщений

Добавлено через 1 минуту
Цитата Сообщение от alexey31415 Посмотреть сообщение
попробуй передавать из главного потока сообщения вторичному при помощии SendMessage,используя хэндл потока
Не получится ведь - иконка ведь сама отправляет сообщение главному потоку, когда с ней что-либо происходит. Я не знаю, как это отловить, чтобы вручную еще отправлять сообщения(SendMessage)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 18:04     Поток с GetMessage
Еще ссылки по теме:

Скопировать поток и добавить ошибки в поток C++
C++ Скопировать поток в поток
Текстовый поток C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 18:04     Поток с GetMessage #20
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Т.е. мои действия:
1)Регистрирую класс
2)Создаю окно, не смотря на то, что у меня уже есть консоль
3)Пишу функцию WndProc, отвечающую за обработку сообщений
Все верно.

Добавлено через 1 минуту
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Не получится ведь - иконка ведь сама отправляет сообщение главному потоку, когда с ней что-либо происходит. Я не знаю, как это отловить, чтобы вручную еще отправлять сообщения(SendMessage)
Тут еще дело в том, что SendMessage отправляет сообщение окну, а не потоку. Так что забудь про это.
Yandex
Объявления
01.09.2012, 18:04     Поток с GetMessage
Ответ Создать тему
Опции темы

Текущее время: 21:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru