• Лови промокод з яким знижка 50 грн - promo50grn

Передача сообщений между потоками Windows

Статус: Offline
Реєстрація: 18.02.2007
Повідом.: 2889
Передача сообщений между потоками Windows

В двух словах: как передать сообщение из одного потока в другой не блокируя выполнение первого?

Например, есть цикл, в котором идет обработка данных, по мере обработки возникают события, в обработчиках которых нужно сделать некоторые операции. Однако первый цикл выполняется с частотой 100мсек и нежелательно что бы обработка событий влияла на частоту исполнения первого потока, поэтому как по мне проще во втором потоке обрабатывать.
В QNX все очень просто, есть MsgSend и MsgReceive/MsgReply и неблокирующие пульсы, а как винде быть? Под винду мало чего многопоточного писал. Или ткните где читнуть?

Из той же оперы: как запустить/обрабатывать таймер в отдельном потоке?
 
Тільки зареєстровані користувачі бачать весь контент у цьому розділі


Разумеется, получающий поток должен иметь цикл обработки сообщений

В Висте и Windows Server 2008 еще добавили
Тільки зареєстровані користувачі бачать весь контент у цьому розділі


Пример использования таймеров как объектов синхронизации потоков можно посмотреть
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
 
Останнє редагування:
хм, вроде похоже на то что надо, а как создать очередь сообщений? честно говоря я в этом полный нуль, можно кусок кода изложить?
 
хм, вроде похоже на то что надо, а как создать очередь сообщений? честно говоря я в этом полный нуль, можно кусок кода изложить?

Она сама создается как только происходит вызов любой функции работы с очередью.

В двух словах: как передать сообщение из одного потока в другой не блокируя выполнение первого?

Например, есть цикл, в котором идет обработка данных, по мере обработки возникают события, в обработчиках которых нужно сделать некоторые операции. Однако первый цикл выполняется с частотой 100мсек и нежелательно что бы обработка событий влияла на частоту исполнения первого потока, поэтому как по мне проще во втором потоке обрабатывать.
В QNX все очень просто, есть MsgSend и MsgReceive/MsgReply и неблокирующие пульсы, а как винде быть? Под винду мало чего многопоточного писал. Или ткните где читнуть?

Из той же оперы: как запустить/обрабатывать таймер в отдельном потоке?

Насчет таймеров смотри сюда
Тільки зареєстровані користувачі бачать весь контент у цьому розділі


или проще можно CreateTimer вызвать и ловить WM_TIMER во втором потоке.

Ваще самый просто вариант синхронизации - это сообщениями, я бы делал с events конечно, но это вопрос религии.
 
ну да, сообщения как раз подходят для этой задачи.
например как в POSIX/QNX

поток приемник
while(1)
{
recvid = MsgReceive(chid,&msg,sizeof(msg),NULL); //получили сообщение по каналу
MsgReply(rcvid,EOK,NULL); //разблокировали поток-отправщик что бы занимался своим дальше
...
что то делаем
}


а поток отправщик
while(1)
{
....
нужно обработать событие, шлем его код в поток-обработчик
MsgSend(coid,message,sizeof(message),NULL,NULL);
дальнейшая обработка
...
}


так отлично работает в QNX и возможно сработает в POSIXе.
В винде все не как у людей )
 
Вот тебе полноценное виндовое приложение. Что не так?

Код:
#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance
                  , HINSTANCE hPrevInstance
                  , LPSTR lpszArgument
                  , int nFunsterStil) {
    MSG messages;
    while (GetMessage(&messages, NULL, 0, 0)) {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }
    return messages.wParam;
}
 
Это называется "обвинение других в своём невежестве".

Ну да. Чуваку не хватает сообразительности почитать Петзольда для начала, но уже заранее "ваша винда говно, а вот QNX аааааа"
 
Ну да. Чуваку не хватает сообразительности почитать Петзольда для начала, но уже заранее "ваша винда говно, а вот QNX аааааа"

ИМХО для задач ТС скорее Рихтера надо читать. Петзольд вроде как про user / GDI больше писал, в "глубины глубин" ядра, в т.ч. синхронизацию потоков он вроде бы не вдавался.

Ну и потом... QNX - это ОС реального времени, а Windows - нет.
 
ИМХО для задач ТС скорее Рихтера надо читать. Петзольд вроде как про user / GDI больше писал, в "глубины глубин" ядра, в т.ч. синхронизацию потоков он вроде бы не вдавался.

"вроде бы", "вроде как"... мы про message loop говорим или где? петзольд как раз и писал про основы основ как педалить под винду. Если бы ТС это прочитал - то глупых вопросов бы не возникло в принципе.
Рихтер - это уже из пушки по воробьям. Мальчик сойдет с ума узнав что socket тоже signaled может быть, а начитавшись про MMF рискует утром не проснуться...

Ну и потом... QNX - это ОС реального времени, а Windows - нет.

И что из этого? В QNX придумали новый кошерный способ синхронизации потоков?
 
Ну вообще-то в POSIX есть такая пиздатая штука как
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
.
 
мы про message loop говорим или где? петзольд как раз и писал про основы основ как педалить под винду

Ты знаешь, про PostThreadMessage и про то, что очередь сообщений - она у потока, а не у окна, я узнал гораздо позже прочтения Петзольда. Не вдавался AFAIR он в такие тонкости...

А городить скрытые окна для обмена сообщениями - ИМХО soo Windows 95, некомильфо, короче :)
 
Есть множество вариантов.
Один тебе уже назвали - сообщения.
Второй - асинхронные сокеты, пайпы, шареные файлы и т.д.
Третий - Еще одна очередь обработки и семафор.
Выбирай какой те по душе.
Первый самый простой. Минусы - несильно удобен для консольных приложений, отработка второго потока зависит от состояния ГУЯ, что может быть неприемлемо.
Второй сложный - для простого мултесрейдинга не очень удачный.
Третий - ИМХО оптимальный.

Например, есть цикл, в котором идет обработка данных, по мере обработки возникают события, в обработчиках которых нужно сделать некоторые операции. Однако первый цикл выполняется с частотой 100мсек и нежелательно что бы обработка событий влияла на частоту исполнения первого потока, поэтому как по мне проще во втором потоке обрабатывать.
В QNX все очень просто, есть MsgSend и MsgReceive/MsgReply и неблокирующие пульсы, а как винде быть? Под винду мало чего многопоточного писал. Или ткните где читнуть?

Винда не QNX надеяться на частоту в 100 мс врят ли стоить :)
 
о, гуру кодинга под виндовс как всегда начали бросаться какашками (ну вы поняли о ком я). вы такие умные вещи говорите, я уже готов на вас молиться. вы просто Бог.
а если по теме, вместо язвительных сообщений можно было бы просто написать какую книгу почитать. и где в моих сообщениях вы увидели что "windows говно" как вы изволили выразиться? то что она другая это не значит что говно.
 
Ты знаешь, про PostThreadMessage и про то, что очередь сообщений - она у потока, а не у окна, я узнал гораздо позже прочтения Петзольда. Не вдавался AFAIR он в такие тонкости...

А городить скрытые окна для обмена сообщениями - ИМХО soo Windows 95, некомильфо, короче :)

Плохо читал. Еще и как вдавался.

о, гуру кодинга под виндовс как всегда начали бросаться какашками (ну вы поняли о ком я). вы такие умные вещи говорите, я уже готов на вас молиться. вы просто Бог.
а если по теме, вместо язвительных сообщений можно было бы просто написать какую книгу почитать. и где в моих сообщениях вы увидели что "windows говно" как вы изволили выразиться? то что она другая это не значит что говно.

Не ты ли сказал "В винде все не как у людей" ?

Короче, читай вот это
Тільки зареєстровані користувачі бачать весь контент у цьому розділі


Но я думаю ты не захочешь этого делать...
 
о, гуру кодинга под виндовс как всегда начали бросаться какашками (ну вы поняли о ком я). вы такие умные вещи говорите, я уже готов на вас молиться. вы просто Бог.
а если по теме, вместо язвительных сообщений можно было бы просто написать какую книгу почитать. и где в моих сообщениях вы увидели что "windows говно" как вы изволили выразиться? то что она другая это не значит что говно.

Отсюда

а конкретнее что читать? ссылкой поделишься или точным названием?
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
. Главы 9-10.

Почитал? Помогло?
 
В двух словах: как передать сообщение из одного потока в другой не блокируя выполнение первого?
Для общей эрудиции (чтобы прекратить твои жалобные стенания про "не все как у людей") читаешь описание функций SendMessage и PostMessage, осознаешь разницу. Одна из них блокирующая, другая нет. А в применении к тредам так еще проще - там только Post:
The PostThreadMessage function posts a message to the message queue of the specified thread. It returns without waiting for the thread to process the message.

Из той же оперы: как запустить/обрабатывать таймер в отдельном потоке?
Точно также как и "не в отдельном потоке". SetTimer(). Обрабатывать - или окошко создай пустое и невидимое или читай про TimerProc().
 
о, гуру кодинга под виндовс как всегда начали бросаться какашками (ну вы поняли о ком я). вы такие умные вещи говорите, я уже готов на вас молиться. вы просто Бог.

мля. *ксоиды как всегда не могут начать разговор по другому :D

по сути. создай отдельный поток обработки сообщений и все события / сообщения сбрасывай в его очередь. а там уже не спеша их обрабатывай.
 
по сути. создай отдельный поток обработки сообщений...
Охуеть. Значится если человеку из потока А в поток Б надо передать сообщение - то ему надо для этого создать отдельный поток С и в нем "не торопясь" эти сообщения обрабатывать. Ню-ню...
и все события / сообщения сбрасывай в его очередь.
Расскажи пожалуйста, как можно сбросить в очередь СОБЫТИЕ. Это будет новое слово в IPC.

Перестань писать бредятину, составленную из вобщем-то правильных слов.
 
Назад
Зверху Знизу