Почему вы не можете печатать из очереди сообщений Windows

importvault спросил: 13 июня 2018 в 11:12 в: c
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>  MSG Msg;  while (GetMessage(&Msg, NULL, 0, 0) > 0 ) {    TranslateMessage(&Msg);    printf("hello world \n");    DispatchMessage(&Msg);
  }

(Запуск обновления для Windows 10 Creator)

Кто-нибудь знает, почему этот prinf не работает?

Похоже на тривиальную вещь, которую нужно суетиться, но я делаю это по нити, и отсутствие возможности printf полностью отбросило меня. Мне очень любопытно узнать внутренние детали относительно того, почему мой стандартный вывод игнорируется - и как это делают окна.

EDIT 1

Я запуск программы на cmd.exe - с помощью ConEmu.

EDIT 2

Это скрипт сборки

C:\mingw64\mingw64\bin\gcc.exe -Wall -g -O2 -c -o main.o main.c

C:\mingw64\mingw64\bin\gcc.exe -Wall -g -shared -o main main.o

ИЗМЕНИТЬ 3

Дело в том, что вы:

  printf("hello world 1 \n");  while (GetMessage(&Msg, NULL, 0, 0) > 0 ) {    printf("hello world 2\n");    TranslateMessage(&Msg);   DispatchMessage(&Msg);
  }

Первое сообщение hello world 1 печатает, а второе hello world 2 не работает!

Это похоже на вызовы windows API делает внешние изменения в моей среде выполнения: (

1 ответ

Barmak Shemirani ответил: 14 июня 2018 в 04:47

GetMessage будет ждать оконное сообщение из окна, связанного с текущим потоком. Ожидание неопределенное, если нет сообщения или нет окна.

Если у вас есть окно и создается сообщение, printf будет вызван как ожидалось. Но вы не должны помещать printf в цикл сообщений. Вместо этого ответьте на конкретное сообщение в процедуре окна.

#include <Windows.h>LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wparam, lparam);
}int main()
{
    printf("hello world 1 \n");    WNDCLASSEX wcex = { sizeof(wcex) };
    wcex.lpfnWndProc = WndProc;
    wcex.lpszClassName = "classname";
    RegisterClassEx(&wcex);
    CreateWindow(wcex.lpszClassName, 0, WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
            0, 0, 300, 200, 0, 0, 0, 0);    MSG Msg;
    while (GetMessage(&Msg, NULL, 0, 0) > 0 )
    {
        printf("hello world 2\n");//<- don't put anything here in the message loop
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return 0;
}
importvault ответил: 15 июня 2018 в 04:34
Бармак Шеримани, спасибо за это! Я не программирование на окнах, поэтому это сильно меня смутило - причина в том, что я использую это в глубоко многопоточной настройке для приложения, которое должно быть совместимо с окнами. Так что, хотя я и делал какую-то сумасшедшую ошибку где-то или хуже, там было какое-то условие гонки! Так что спасибо, что заставили меня чувствовать себя в покое!

Дополнительное видео по вопросу: Почему вы не можете печатать из очереди сообщений Windows

Как очистить очередь печати принтера в Windows 7/8/8.1/10

Перезагрузка системы печати, если задание печати «застряло» в очереди печати Windows

Как очистить очередь печати в Windows 10