• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

WinApi C++ - Główna pętla

Object Storage Arubacloud
0 głosów
374 wizyt
pytanie zadane 5 października 2017 w C i C++ przez Hapsiu Użytkownik (510 p.)

Witam.

Zwracam się z prośbą o wytłumaczenie działania głównej pętli:

while(GetMessage(&msg, NULL, 0, 0) > 0) {
	TranslateMessage(&msg);
	DispatchMessage(&msg);
}

W programie:
 

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
	switch(Message) {
		
		case WM_DESTROY: {
			PostQuitMessage(0);
			break;
		}
		
		default:
			return DefWindowProc(hwnd, Message, wParam, lParam);
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASSEX wc;
	HWND hwnd;
	MSG msg;

	memset(&wc,0,sizeof(wc));
	wc.cbSize		 = sizeof(WNDCLASSEX);
	wc.lpfnWndProc	 = WndProc;
	wc.hInstance	 = hInstance;
	wc.hCursor		 = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
	wc.lpszClassName = "WindowClass";
	wc.hIcon		 = LoadIcon(NULL, IDI_APPLICATION);
	wc.hIconSm		 = LoadIcon(NULL, IDI_APPLICATION);

	if(!RegisterClassEx(&wc)) {
		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","FrameRateTest",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT,
		CW_USEDEFAULT,
		640,
		480,
		NULL,NULL,hInstance,NULL);

	if(hwnd == NULL) {
		MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
		return 0;
	}

	while(GetMessage(&msg, NULL, 0, 0) > 0) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

Jak sprawić aby pętla była wykonywana na okrągło z przerwą w milisekundach z pomocą np funkcji Sleep(). Chodzi mi o to, że wcześniej wspomniana pętla wykonywana jest tylko gdy wykonywana jest jakaś czynność (aktywność urzytkownika). Dlaczego gdy funkcja jest wykonywana na okrągło np. while(true) program nie odpowiada?

1 odpowiedź

0 głosów
odpowiedź 5 października 2017 przez adrian17 Ekspert (344,860 p.)
wybrane 5 października 2017 przez Hapsiu
 
Najlepsza

Jak sprawić aby pętla była wykonywana na okrągło z przerwą w milisekundach z pomocą np funkcji Sleep().

Nie powinieneś tego robić, patrz niżej.

Chodzi mi o to, że wcześniej wspomniana pętla wykonywana jest tylko gdy wykonywana jest jakaś czynność (aktywność urzytkownika).

Tak, o to chodzi. To pętla zdarzeń, jej celem jest reagowanie na zdarzenia.

Dlaczego gdy funkcja jest wykonywana na okrągło np. while(true) program nie odpowiada?

Nie zrozumiałem, gdzie dokładnie umieściłeś `while(true)`. W każdym razie:

Ten kawałek kodu odpowiada właśnie za "odpowiadanie" na zdarzenia dowolnej postaci - w tym komunikację z systemem. Jeśli w jakiś sposób zablokujesz jej wykonywanie na dłuższy czas, program... nie będzie w stanie odpowiadać.

Jeśli chcesz np. robić jakiekolwiek dłużej trwające obliczenia - powinno się je robić na osobnym wątku, by nie blokować wątku obsługi zdarzeń.

(inna sprawa: po co w ogóle piszesz w WinApi? To jest dość niskopoziomowe i bardzo brzydkie API; obecnie bardzo rzadko jest powód żeby go używać zamiast WinForms/WPF/JavaFX/Qt.)

Podobne pytania

+1 głos
1 odpowiedź 265 wizyt
0 głosów
1 odpowiedź 105 wizyt
pytanie zadane 10 stycznia 2023 w C i C++ przez Rykez Początkujący (250 p.)
0 głosów
1 odpowiedź 251 wizyt
pytanie zadane 16 lutego 2018 w C i C++ przez Shiro Stary wyjadacz (10,300 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...