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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.88
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
#1

Поток с GetMessage - C++

01.09.2012, 10:15. Просмотров 2413. Ответов 26
Метки нет (Все метки)

Привет всем. У меня в программе в отдельном потоке имеется такой код:
C++
1
2
3
4
5
while(GetMessage(&msg,0,0,0) 
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
Из основной программы я запускаю этот поток и программа останавливается на нём, хотя она должна продолжить выполняться дальше.
В чем моя ошибка?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.09.2012, 10:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поток с GetMessage (C++):

Скопировать поток и добавить ошибки в поток - C++
Здорова господа! Есть задачка: "Скопируйте поток объектов типа Name_and_address и вставьте в него столько ошибок, сколько сколько...

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. - C++
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде...

Скопировать поток в поток - C++
Есть ли возможность скопировать один поток в другой. Например int main() { ofstream (*P) = new ofstream; ofstream...

STL и поток - C++
Есть вектор, объявленный в основной программе, состоящий из ссылок на компоненты типа TImage и TCheckBox: struct mass { TImage *img; ...

Не работает поток - C++
Всем доброго времени суток. Ниже представлен код программы, считывающей инф. о пользователе с файла. Проблема: После считывания...

Поток stdin - C++
Доброго времени суток. Ситуация следующая: пытаюсь расширить свои знания в программировании на С++, поэтому начал читать книгу Коплиена...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
01.09.2012, 11:01 #2
Покажи весь код
0
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
01.09.2012, 11:02  [ТС] #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();
}
И да, я разобрался с запуском потока, но как там получить сообщение из очереди? Мне в сторону хуков?
0
alexey31415
59 / 59 / 3
Регистрация: 16.05.2010
Сообщений: 632
01.09.2012, 11:32 #4
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
while(true)
у тебя в коде нет ни единого способа выйти из этого бесконечного цикла,так что всё правильно
по какому словию у тебя должен быть выход из цикла?
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
01.09.2012, 11:40 #5
RaiaNKnight, а что насчет обычного цикла ?
C++
1
2
3
4
5
while (GetMessage(&msg, NULL, 0, 0))
    {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
    }
0
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
01.09.2012, 13:11  [ТС] #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 пустым остается, хотя я кликаю например правой кнопкой по консоли
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 13:41 #7
RaiaNKnight, а зачем ты вообще message loop засунул в отдельный поток?
0
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
01.09.2012, 13:51  [ТС] #8
Цитата Сообщение от lazybiz Посмотреть сообщение
RaiaNKnight, а зачем ты вообще message loop засунул в отдельный поток?
Ну суть такая: у меня в отдельной процедуре есть цикл, который используется для постоянной записи звука.
Мне же нужно как-то постоянно контролировать сообщения из трея, например, щелчок правой кнопкой мыши на иконке вызовет контекстное меню

Поэтому я могу сделать это при помощи цикла в отдельном потоке. Затолкать же саму процедуру для записи звука в отдельный поток геморно
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 13:56 #9
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Затолкать же саму процедуру для записи звука в отдельный поток геморно
Зато правильно. А почему геморно?
0
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
01.09.2012, 14:12  [ТС] #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;
}
Просто у меня даже здесь обработка не идет
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 14:18 #11
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
а вот эта программа должна ведь работать:
Нет. GetMessage обрабатывает сообщения окна(окон), а у тебя его нет. Необходимо зарегистрировать класс и создать окно.
1
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
01.09.2012, 14:19  [ТС] #12
А консольное не годится никак вообще?
Значит я и в потоке смогу ловить сообщения потом?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 14:27 #13
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
А консольное не годится никак вообще?
Для консольного не нужна процедура окна. Тебе вообще нужно окно?
Цитата Сообщение от RaiaNKnight Посмотреть сообщение
Значит я и в потоке смогу ловить сообщения потом?
Так ты без окна и класса это делать пытался? В потоке тоже должно работать, только это как-то не правильно получается.
0
RaiaNKnight
96 / 70 / 7
Регистрация: 29.06.2011
Сообщений: 465
Записей в блоге: 1
01.09.2012, 14:31  [ТС] #14
У меня всё так:
Консольное приложение(Win32). В консоли некотор-е данные выводятся.

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

В качестве окна я думал, что можно использовать HWND от GetConsoleWindow(), а про класс я не знал
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
01.09.2012, 14:47 #15
А какие тебе нужно обрабатывать сообщения?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2012, 14:47
Привет! Вот еще темы с ответами:

Указатель на поток - C++
void qwe(ifstream *file) { int ch; (*file) &gt;&gt; ch; } int main() { ifstream ifile (&quot;abc.txt&quot;); ...

Поток cin - C++
Ребят подскажите почему после того как в цикле для потока cin устанавливается по команде Ctrl+z бит eofbit я не могу юзать поток cin он у...

Поток и принтер - C++
1. Имеет ли дефолтный принтер стандартный поток? Если имеет, то как его зовут? Надо ли его открывать/закрывать? 2. Можно ли к дефольному...

Очистить поток - C++
Хотел с помощью куска кода (см.ниже) очистить буфер связанный с потоком cin. Но выражение в скобках по какой-то причине не изменяется? ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.09.2012, 14:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru