про цикл обработки сообщений
От: Sarkisov Sergei Беларусь  
Дата: 28.04.02 17:15
Оценка:
Господа помогите юзеру советом!
Предположим есть цикл обработки сообщений, но в проге нет окон => нет и оконных процедур обработки сообщений, могу ли я поместить в очередь сообщений такого безоконного приложения(предположим из другого приложения) какое-нибудь сообщение, например, WM_QUIT для выхода из цикла.
Re: про цикл обработки сообщений
От: Alex Fedotov США  
Дата: 28.04.02 17:19
Оценка:
Здравствуйте Sarkisov Sergei, Вы писали:

SS>Предположим есть цикл обработки сообщений, но в проге нет окон => нет и оконных процедур обработки сообщений, могу ли я поместить в очередь сообщений такого безоконного приложения(предположим из другого приложения) какое-нибудь сообщение, например, WM_QUIT для выхода из цикла.


Ответ: да.

Существуют сообщения, не предназначенные конкретному окну, которые обрабатываются непосредственно в цикле обработки сообщений. WM_QUIT относится именно к таким сообщениям.
-- Alex Fedotov
Re[2]: про цикл обработки сообщений
От: Sarkisov Sergei Беларусь  
Дата: 28.04.02 17:26
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

Это так, но как поместить это сообщение в очередь приложения если у него (приложения) нет окон?
Re[3]: про цикл обработки сообщений
От: Alex Fedotov США  
Дата: 28.04.02 17:30
Оценка:
Здравствуйте Sarkisov Sergei, Вы писали:

SS>Это так, но как поместить это сообщение в очередь приложения если у него (приложения) нет окон?


PostThreadMessage.
-- Alex Fedotov
Re[4]: про цикл обработки сообщений
От: Sarkisov Sergei Беларусь  
Дата: 28.04.02 17:41
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

Спасибо за PostThreadMessage и за DLL
Re[5]: про цикл обработки сообщений
От: Аноним  
Дата: 28.04.02 18:39
Оценка:
Уважаемый Alex! пожалуйста объясните почему цикл такой программы крутится ?

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
DWORD hThr;

hThr=GetCurrentThreadId();
PostThreadMessage(hThr,WM_QUIT,0,0);
while (GetMessage(&msg,0,0,0)) {
}
return 0;
}
c уважением Сергей
Re[6]: про цикл обработки сообщений
От: SergH Россия  
Дата: 29.04.02 03:42
Оценка:
Здравствуйте Аноним, Вы писали:

А>Уважаемый Alex! пожалуйста объясните почему цикл такой программы крутится ?


А>int APIENTRY WinMain(HINSTANCE hInstance,

А> HINSTANCE hPrevInstance,
А> LPSTR lpCmdLine,
А> int nCmdShow)
А>{
А> MSG msg;
А> DWORD hThr;

А> hThr=GetCurrentThreadId();

А> PostThreadMessage(hThr,WM_QUIT,0,0);
А> while (GetMessage(&msg,0,0,0)) {
А> }
А> return 0;
А>}
А> c уважением Сергей

У меня не крутится, а сразу выходит.
Делай что должно, и будь что будет
Re[6]: про цикл обработки сообщений
От: Alex Fedotov США  
Дата: 29.04.02 04:25
Оценка:
Здравствуйте Аноним, Вы писали:

А>Уважаемый Alex! пожалуйста объясните почему цикл такой программы крутится ?


А>int APIENTRY WinMain(HINSTANCE hInstance,

А> HINSTANCE hPrevInstance,
А> LPSTR lpCmdLine,
А> int nCmdShow)
А>{
А> MSG msg;
А> DWORD hThr;

А> hThr=GetCurrentThreadId();

А> PostThreadMessage(hThr,WM_QUIT,0,0);
А> while (GetMessage(&msg,0,0,0)) {
А> }
А> return 0;
А>}
А> c уважением Сергей

Причина может быть в том, что на момент вызова PostThreadMessage у потока еще не существует очередь сообщений и функция завершается с ошибкой (надо проверить возвращаемое значение PostThreadMessage).

Чтобы заставить систему создать очеребь сообщений для потока, достаточно вызвать PeekMessage. Вот такая программа должна завершаться:

    MSG msg;
    DWORD hThr;

    PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);  

    hThr=GetCurrentThreadId();
    PostThreadMessage(hThr,WM_QUIT,0,0);

    while (GetMessage(&msg,0,0,0));
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.