<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[Erledigt] WinAPI und std::thread]]></title><description><![CDATA[<p>Hiho,<br />
wusste nicht, welche Überschrift ich nehmen soll - ich hoffe, dass es soweit passt. Hänge seit Tagen an der gleichen Stelle in meinem Programm. Was es werden soll, ist erstmal irrelevant denke ich, da es hier primär um folgendes Problem geht:</p>
<p>Wenn ich eine längere While-Schleife mit einem Button-Klick auslösen möchte, kann ich das Fenster nicht bewegen o.A., da es ja auf die Beendigung der Schleife wartet. Das ist ziemlich nervig und zudem aktualisiert sich auf diese Weise nicht einmal die Progressbar bzw. der Fortschritt wird erst zum Ende der For-Schleife angezeigt. Da diese je nach Eingabe der User mehrere Minuten andauern kann, ist es m.E. durchaus wichtig, dass man das Programm während der Laufzeit der For-Schleife auch bewegen kann und den Fortschritt sieht.</p>
<p>Meine WinMain:</p>
<pre><code>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
	HWND		hWnd;
	MSG			msg;
	WNDCLASS	wc;

	/* Fensterklasse definieren */
	wc.style			= CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc		= WndProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= hInstance;
	wc.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground	= HBRUSH(COLOR_WINDOW);
	wc.lpszMenuName		= MAKEINTRESOURCE(IDR_MENU1);
	wc.lpszClassName	= chClass;

	/* Fensterklasse registrieren */
	RegisterClass(&amp;wc);

	/* Hauptfenster erstellen */
	hWnd = CreateWindow(chClass, chTitle, WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 307, 308, NULL, NULL, hInstance, NULL);

	ShowWindow(hWnd, iCmdShow);
	UpdateWindow(hWnd);

	/* Hauptnachrichtenschleife */
	while (GetMessage(&amp;msg, NULL, 0, 0)) {
		TranslateMessage(&amp;msg);
		DispatchMessage(&amp;msg);
	}

	return msg.wParam;
}
</code></pre>
<p>Mein Meldungshandler:</p>
<pre><code>LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	switch (message) {
		case WM_CREATE: {		
			/* Die GUI Elemente hab ich mal rausgelassen */
		} break;

		/* Wenn das Programm einen Befehl erhält */
		case WM_COMMAND: {
			/* Aktionen verarbeiten */
			switch (LOWORD(wParam)) {
				case BTN_OLD_ID: {
					oldList = openFileDialog(hWnd, GetDlgItem(hWnd, EDIT_OLD_ID));
				} break;

				case BTN_NEW_ID: {
					newList = saveFileDialog(hWnd, GetDlgItem(hWnd, EDIT_NEW_ID));
				} break;

				case BTN_START_ID: {
					std::thread(egalWelcheFunktion, egalWelcherParameter);
				} break;

				case BTN_STOP_ID: {
					/* Stop Funktion noch nicht implementiert */
					MessageBox(hWnd, &quot;You have pressed the stop button.&quot;, NULL, NULL);
				} break;

				case ID_FILE_EXIT: {
					DestroyWindow(hWnd);
				} break;

				case ID_HELP_INFO: {
					MessageBox(hWnd, &quot;Tool by X&quot;, &quot;Info&quot;, MB_ICONINFORMATION);
				} break;

				default: {
				} return DefWindowProc(hWnd, message, wParam, lParam);
			}
		} break;

		/* Färbt Readonly Edits weiß */
		case WM_CTLCOLORSTATIC: {
			if (GetDlgItem(hWnd, EDIT_OLD_ID) == HWND(lParam) || GetDlgItem(hWnd, EDIT_NEW_ID) == HWND(lParam)) {
				return LRESULT(GetStockObject(WHITE_BRUSH));
			}

			SetBkColor(HDC(wParam), RGB(240, 240, 240));
		} return LRESULT(GetStockObject(NULL_BRUSH));

		case WM_DESTROY: {
			PostQuitMessage(0);
		} break;

		default: {
		} return DefWindowProc(hWnd, message, wParam, lParam);
	}

	return 0;
}
</code></pre>
<p>Das funktioniert leider nicht. Ohne std::thread funktionierts prima. Mit .join() hinten dran auch, aber ich möchte ja den Thread parallel zum Main Thread (in dem das Fenster läuft) laufen lassen. Egal welche Funktion, ob es nun nur ein MessageBeep(0); oder ähnliches ist. Irgendwer eine Idee?</p>
<p>Falls ich mein Problem ungenau beschrieben habe, tut's mir leid, da dass leider hier mein erster Thread ist und ich langsam verzweifel hier^^</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313266/erledigt-winapi-und-std-thread</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 08:41:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313266.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Jan 2013 17:24:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Erledigt] WinAPI und std::thread on Fri, 25 Jan 2013 17:39:35 GMT]]></title><description><![CDATA[<p>Hiho,<br />
wusste nicht, welche Überschrift ich nehmen soll - ich hoffe, dass es soweit passt. Hänge seit Tagen an der gleichen Stelle in meinem Programm. Was es werden soll, ist erstmal irrelevant denke ich, da es hier primär um folgendes Problem geht:</p>
<p>Wenn ich eine längere While-Schleife mit einem Button-Klick auslösen möchte, kann ich das Fenster nicht bewegen o.A., da es ja auf die Beendigung der Schleife wartet. Das ist ziemlich nervig und zudem aktualisiert sich auf diese Weise nicht einmal die Progressbar bzw. der Fortschritt wird erst zum Ende der For-Schleife angezeigt. Da diese je nach Eingabe der User mehrere Minuten andauern kann, ist es m.E. durchaus wichtig, dass man das Programm während der Laufzeit der For-Schleife auch bewegen kann und den Fortschritt sieht.</p>
<p>Meine WinMain:</p>
<pre><code>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
	HWND		hWnd;
	MSG			msg;
	WNDCLASS	wc;

	/* Fensterklasse definieren */
	wc.style			= CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc		= WndProc;
	wc.cbClsExtra		= 0;
	wc.cbWndExtra		= 0;
	wc.hInstance		= hInstance;
	wc.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground	= HBRUSH(COLOR_WINDOW);
	wc.lpszMenuName		= MAKEINTRESOURCE(IDR_MENU1);
	wc.lpszClassName	= chClass;

	/* Fensterklasse registrieren */
	RegisterClass(&amp;wc);

	/* Hauptfenster erstellen */
	hWnd = CreateWindow(chClass, chTitle, WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 307, 308, NULL, NULL, hInstance, NULL);

	ShowWindow(hWnd, iCmdShow);
	UpdateWindow(hWnd);

	/* Hauptnachrichtenschleife */
	while (GetMessage(&amp;msg, NULL, 0, 0)) {
		TranslateMessage(&amp;msg);
		DispatchMessage(&amp;msg);
	}

	return msg.wParam;
}
</code></pre>
<p>Mein Meldungshandler:</p>
<pre><code>LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	switch (message) {
		case WM_CREATE: {		
			/* Die GUI Elemente hab ich mal rausgelassen */
		} break;

		/* Wenn das Programm einen Befehl erhält */
		case WM_COMMAND: {
			/* Aktionen verarbeiten */
			switch (LOWORD(wParam)) {
				case BTN_OLD_ID: {
					oldList = openFileDialog(hWnd, GetDlgItem(hWnd, EDIT_OLD_ID));
				} break;

				case BTN_NEW_ID: {
					newList = saveFileDialog(hWnd, GetDlgItem(hWnd, EDIT_NEW_ID));
				} break;

				case BTN_START_ID: {
					std::thread(egalWelcheFunktion, egalWelcherParameter);
				} break;

				case BTN_STOP_ID: {
					/* Stop Funktion noch nicht implementiert */
					MessageBox(hWnd, &quot;You have pressed the stop button.&quot;, NULL, NULL);
				} break;

				case ID_FILE_EXIT: {
					DestroyWindow(hWnd);
				} break;

				case ID_HELP_INFO: {
					MessageBox(hWnd, &quot;Tool by X&quot;, &quot;Info&quot;, MB_ICONINFORMATION);
				} break;

				default: {
				} return DefWindowProc(hWnd, message, wParam, lParam);
			}
		} break;

		/* Färbt Readonly Edits weiß */
		case WM_CTLCOLORSTATIC: {
			if (GetDlgItem(hWnd, EDIT_OLD_ID) == HWND(lParam) || GetDlgItem(hWnd, EDIT_NEW_ID) == HWND(lParam)) {
				return LRESULT(GetStockObject(WHITE_BRUSH));
			}

			SetBkColor(HDC(wParam), RGB(240, 240, 240));
		} return LRESULT(GetStockObject(NULL_BRUSH));

		case WM_DESTROY: {
			PostQuitMessage(0);
		} break;

		default: {
		} return DefWindowProc(hWnd, message, wParam, lParam);
	}

	return 0;
}
</code></pre>
<p>Das funktioniert leider nicht. Ohne std::thread funktionierts prima. Mit .join() hinten dran auch, aber ich möchte ja den Thread parallel zum Main Thread (in dem das Fenster läuft) laufen lassen. Egal welche Funktion, ob es nun nur ein MessageBeep(0); oder ähnliches ist. Irgendwer eine Idee?</p>
<p>Falls ich mein Problem ungenau beschrieben habe, tut's mir leid, da dass leider hier mein erster Thread ist und ich langsam verzweifel hier^^</p>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293439</guid><dc:creator><![CDATA[An0nym0us]]></dc:creator><pubDate>Fri, 25 Jan 2013 17:39:35 GMT</pubDate></item><item><title><![CDATA[Reply to [Erledigt] WinAPI und std::thread on Fri, 25 Jan 2013 17:29:57 GMT]]></title><description><![CDATA[<p>Probier anstatt .join mal .detach</p>
<p><a href="http://en.cppreference.com/w/cpp/thread/thread/detach" rel="nofollow">http://en.cppreference.com/w/cpp/thread/thread/detach</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293442</guid><dc:creator><![CDATA[dggdfgdfg]]></dc:creator><pubDate>Fri, 25 Jan 2013 17:29:57 GMT</pubDate></item><item><title><![CDATA[Reply to [Erledigt] WinAPI und std::thread on Fri, 25 Jan 2013 17:38:44 GMT]]></title><description><![CDATA[<p>Vielen vielen Dank!</p>
<p>Das hat mir sehr geholfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293451</guid><dc:creator><![CDATA[An0nym0us]]></dc:creator><pubDate>Fri, 25 Jan 2013 17:38:44 GMT</pubDate></item></channel></rss>